[ELMA3] Сущности
Сущность (тип сущности) – класс, экземпляры которого могут храниться в базе данных. Сущностям соответствует объект метаданных с типом EleWise.ELMA.Model.Metadata.EntityMetadata.
Каждый тип сущности имеет:
- общие параметры: Имя (Имя класса), Отображаемое имя, Описание, Имя таблицы в базе данных и др. (см. класс EntityMetadata);
- список свойств, каждое из которых имеет имя (имя свойства), отображаемое имя, описание, тип, настройки (ограничения, имя поля в таблице БД) и др. (см. класс EntityPropertyMetadata).
Дополнительно может иметь:
- Фильтр – параметры, по которым может производиться поиск экземпляров сущностей (см. класс EntityFilterMetadata);
- Действия – список действий с сущностью (см. класс EntityActionsMetadata).
Описание сущностей производится с помощью Редактора сущностей. При объявлении типов используются базовые интерфейсы для сущностей - EleWise.ELMA.Model.Entities.IEntity и EleWise.ELMA.Model.Entities.IEntity<TId>
namespace EleWise.ELMA.Model.Entities
{
/// <summary>
/// Базовый интерфейс сущности
/// </summary>
public interface IEntity
{
///<summary>
/// Возвращает строковое представление сущности
///</summary>
///<param name="format">Формат отображения, свойства доступны через {$Имя свойства}</param>
///<returns>Строка представляющая сущность</returns>
string ToString(string format);
/// <summary>
/// Получить нетипизированное значение идентификатора у сущности
/// </summary>
/// <returns>Значение идентификатора</returns>
object GetId();
/// <summary>
/// Получить значение свойства по его уникальному идентификатору
/// </summary>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <returns>Значение свойства</returns>
object GetPropertyValue(Guid propertyUid);
/// <summary>
/// Получить значение свойства по его уникальному идентификатору
/// </summary>
/// <typeparam name="T">Тип свойства</typeparam>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <returns>Значение свойства</returns>
T GetPropertyValue<T>(Guid propertyUid);
/// <summary>
/// Установить значение свойства по его уникальному идентификатору
/// </summary>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <param name="value">Значение свойства</param>
void SetPropertyValue(Guid propertyUid, object value);
/// <summary>
/// Сохранить сущность
/// </summary>
void Save();
/// <summary>
/// Удалить сущность
/// </summary>
void Delete();
/// <summary>
/// Обновить сущность из БД
/// </summary>
void Refresh();
}
/// <summary>
/// Интерфейс сущности с идентификатором
/// </summary>
/// <typeparam name="IdT">Тип идентификатора (первичного ключа)</typeparam>
public interface IEntity<IdT> : IEntity
{
/// <summary>
/// Идентификатор (первичный ключ)
/// </summary>
IdT Id { get; set; }
}
}
а также базовый класс для сущностей:
namespace EleWise.ELMA.Model.Entities
{
/// <summary>
/// Сущность с идентификатором
/// </summary>
/// <typeparam name="IdT">Тип идентификатора (первичного ключа)</typeparam>
public abstract class Entity<IdT> : IEntity<IdT>
{
/// <summary>
/// Идентификатор (первичный ключ)
/// </summary>
public virtual IdT Id { get; set; }
/// <summary>
/// Сохранить сущность
/// </summary>
public virtual void Save();
/// <summary>
/// Удалить сущность
/// </summary>
public virtual void Delete();
/// <summary>
/// Обновить сущность из БД
/// </summary>
public virtual void Refresh();
/// <summary>
/// Получить нетипизированное значение идентификатора у сущности
/// </summary>
/// <returns>Значение идентификатора</returns>
public virtual object GetId();
/// <summary>
/// Получить значение свойства по его уникальному идентификатору
/// </summary>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <returns>Значение свойства</returns>
public virtual object GetPropertyValue(Guid propertyUid);
/// <summary>
/// Получить значение свойства по его уникальному идентификатору
/// </summary>
/// <typeparam name="T">Тип свойства</typeparam>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <returns>Значение свойства</returns>
public virtual T GetPropertyValue<T>(Guid propertyUid);
/// <summary>
/// Установить значение свойства по его уникальному идентификатору
/// </summary>
/// <param name="propertyUid">Уникальный идентификатор свойства</param>
/// <param name="value">Значение свойства</param>
public virtual void SetPropertyValue(Guid propertyUid, object value);
///<summary>
/// Возвращает строковое представление объекта в указанном формате
///</summary>
///<param name="format">Формат отображения, свойства доступны через {$Имя свойства}</param>
///<returns>Строка представляющая сущность</returns>
public virtual string ToString(string format);
}
}
Типы сущностей
В системе ELMA можно выделить несколько типов описания сущности в зависимости от их расширяемости.
Обычная сущность (Entity)
Обычная сущность – нерасширяемая сущность. Внешние модули не могут расширять/изменять ее. Данному типу сущности соответствует объект метаданных EleWise.ELMA.Model.Metadata.EntityMetadata со значением свойства Type равным EntityMetadataType.Entity.
На основе метаданных генерируется класс. Пример автогенерируемого кода:
/// <summary>
/// Пользователь
/// </summary>
[MetadataType(typeof(EntityMetadata))]
[EntityMetadataType(EntityMetadataType.Entity)]
public partial class User : Entity<long>
{
/// <summary>
/// Учетная запись
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Пароль
/// </summary>
public string Password { get; set; }
}
Интерфейс сущности (Entity Interface)
Интерфейс сущности – интерфейс, описывающий расширяемую сущность. Внешние модули могут расширять/изменять ее при помощи интерфейсов расширения. Данному типу сущности соответствует объект метаданных EleWise.ELMA.Model.Metadata.EntityMetadata со значением свойства Type равным EntityMetadataType.Interface.
На основе метаданных генерируется интерфейс. Пример автогенерируемого кода:
/// <summary>
/// Пользователь
/// </summary>
[MetadataType(typeof(EntityMetadata))]
[EntityMetadataType(EntityMetadataType.Interface)]
[Uid("04d5bcbf-4288-4d95-9745-1ebd0d690bb3")]
[ImplementationUid("18faf3ae-03c9-4e64-b02a-95dd63e54c4d")]
public partial interface IUser : IEntity<long>
{
/// <summary>
/// Учетная запись
/// </summary>
string UserName { get; set; }
/// <summary>
/// Пароль
/// </summary>
string Password { get; set; }
}
Интерфейс расширения сущности (Entity Interface Extension)
Интерфейс расширения сущности – интерфейс, описывающий дополнительные свойства для расширяемой сущности. Данному типу сущности соответствует объект метаданных EleWise.ELMA.Model.Metadata.EntityMetadata со значением свойства Type равным EntityMetadataType.InterfaceExtension.
На основе метаданных генерируется интерфейс. Пример автогенерируемого кода:
/// <summary>
/// Расширение пользователя для модуля ICQ
/// </summary>
[MetadataType(typeof(EntityMetadata))]
[EntityMetadataType(EntityMetadataType.InterfaceExtension)]
[Uid("07ff5f61-f3d3-4a4b-82e8-4458520f0dcc")]
[BaseClass("04d5bcbf-4288-4d95-9745-1ebd0d690bb3")]
public partial interface IUser_ICQExt : IUser
{
/// <summary>
/// Номер ICQ
/// </summary>
string ICQ { get; set; }
}
Реализация интерфейса сущности (Entity Interface Implementation)
Реализация интерфейса сущности – обычная сущность, реализующая интерфейс сущности, а также набор интерфейсов расширения. Данному типу сущности соответствует объект метаданных EleWise.ELMA.Model.Metadata.EntityMetadata со значением свойства Type равным EntityMetadataType.InterfaceImplementation.
Пример автогенерируемого кода:
/// <summary>
/// Пользователь
/// </summary>
[MetadataType(typeof(EntityMetadata))]
[EntityMetadataType(EntityMetadataType.InterfaceImplementation)]
[Uid("18faf3ae-03c9-4e64-b02a-95dd63e54c4d")]
[ImplementationUid("04d5bcbf-4288-4d95-9745-1ebd0d690bb3")]
[Implement(typeof(IUser))]
[Implement(typeof(IUser_ICQExt))]
public partial class User : Entity<long>, IUser, IUser_ICQExt
{
/// <summary>
/// Учетная запись
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Пароль
/// </summary>
public string Password { get; set; }
/// <summary>
/// Номер ICQ
/// </summary>
public string ICQ { get; set; }
}
Фильтры сущностей. Работа с интерфейсами сущностей
При запуске системы выбираются сущности с типами Интерфейс и Расширение интерфейса и строится сборка с именем EleWise.ELMA.DynamicModel, в которой создаются реализации интерфейсов (сущности с типом Реализация интерфейса).
Для создания экземпляра интерфейса сущности или фильтра необходимо использовать метод Create класса EleWise.ELMA.Model.Services.InterfaceActivator.
using EleWise.ELMA.Model.Services;
public class SomeClass
{
public void SomeMethod()
{
var user = InterfaceActivator.Create<IUser>();
user.UserName = "User 1";
user.Save();
}
}
Если необходимо получить тип реализации интерфейса сущности или фильтра, то нужно использовать метод TypeOf класса InterfaceActivator.
using EleWise.ELMA.Model.Services;
public class SomeClass
{
public void SomeMethod()
{
Type userType = InterfaceActivator.TypeOf<IUser>();
}
}
Менеджеры сущностей
Менеджер сущности – сервис, предназначенный для работы с конкретной сущностью. Он содержит все необходимые методы для работы с ней (сохранение, загрузка, поиск, различные действия и др.). Подробную информацию о менеджерах сущностей см. в статье Менеджеры сущностей.