[ELMA3] Сущности
Сущность (тип сущности) – класс, экземпляры которого могут храниться в базе данных. Сущностям соответствует объект метаданных с типом EleWise.ELMA.Model.Metadata.EntityMetadata.
Каждый тип сущности имеет:
- общие параметры: Имя (Имя класса), Отображаемое имя, Описание, Имя таблицы в базе данных и др. (см. класс EntityMetadata);
- список свойств, каждое из которых имеет имя (имя свойства), отображаемое имя, описание, тип, настройки (ограничения, имя поля в таблице БД) и др. (см. класс EntityPropertyMetadata).
Дополнительно может иметь:
- Фильтр – параметры, по которым может производиться поиск экземпляров сущностей (см. класс EntityFilterMetadata);
- Действия – список действий с сущностью (см. класс EntityActionsMetadata).
Описание сущностей производится с помощью Редактора сущностей. При объявлении типов используются базовые интерфейсы для сущностей - EleWise.ELMA.Model.Entities.IEntity и EleWise.ELMA.Model.Entities.IEntity<TId>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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 ; } } } |
а также базовый класс для сущностей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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.
На основе метаданных генерируется класс. Пример автогенерируемого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /// <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.
На основе метаданных генерируется интерфейс. Пример автогенерируемого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /// <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.
На основе метаданных генерируется интерфейс. Пример автогенерируемого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /// <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.
Пример автогенерируемого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /// <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.
1 2 3 4 5 6 7 8 9 10 11 12 13 | using EleWise.ELMA.Model.Services; public class SomeClass { public void SomeMethod() { var user = InterfaceActivator.Create<IUser>(); user.UserName = "User 1" ; user.Save(); } } |
Если необходимо получить тип реализации интерфейса сущности или фильтра, то нужно использовать метод TypeOf класса InterfaceActivator.
1 2 3 4 5 6 7 8 9 10 11 | using EleWise.ELMA.Model.Services; public class SomeClass { public void SomeMethod() { Type userType = InterfaceActivator.TypeOf<IUser>(); } } |
Менеджеры сущностей
Менеджер сущности – сервис, предназначенный для работы с конкретной сущностью. Он содержит все необходимые методы для работы с ней (сохранение, загрузка, поиск, различные действия и др.). Подробную информацию о менеджерах сущностей см. в статье Менеджеры сущностей.