Книга: Дефрагментация мозга. Софтостроение изнутри

Слой домена (NHibernate)

Слой домена (NHibernate)

Джинн NHibernate генерирует три C#-файла и один XML-файл проекции (маппинга) классов на структуры хранения.


Все классы домена являются расширяемыми (partial), что позволяет разработчику вынести специфичные не поддерживаемые моделью реализации свойств и методов классов в отдельные файлы.

Перечисляемый тип создаётся вместе с классами, позволяющими локализовать пользовательские названия его элементов, описанные в модели. По умолчанию будет использован язык модели, перевод необходимо осуществлять в технологии gettext.


Рис. 22. Перечисляемый тип слоя домена и его локализация


Рис. 23. Класс «Финансовый год» слоя домена

Для определяемых моделью сущностей генерируются классы, содержащие кроме соответствующих объявленным атрибутам свойств ещё и группу служебных методов для управления объектами, например, для сохранения или выборки по запросу на HQL или даже SQL. Такие методы часто используют служебные классы, объявленные в DomainSupport.cs.

Для объявленных в модели операций генерируется соответствующий метод интерфейса. Реализовать их нужно программисту в рамках расширения partial-класса.


Рис. 24. Класс «Учётный период» слоя домена

Отображение классов на структуры РСУБД соответствует стратегии «одна таблица на подкласс без дублирования атрибутов предка», достаточно хорошей в большинстве случаев, но и она может быть изменена.

Фрагмент файла проекции для класса «Финансовый год»

<!-Engine.FiscalYear->

<class name="Domain.Engine.FiscalYear" table="FISCAL_YEAR" schema="MYAPP">

<id name="Id" access="property" column="NIFISCAL_YEAR">

<generator class="native">

<param name="sequence">MYAPP.SEQ_FISCAL_YEAR</param>

</generator>

</id>

<version name="Version" column="VERSION" type="int" access="property" />

<set name="Periods" table="MYAPP.PERIOD" inverse="true" lazy="true" cascade="none">

<key column="NI_FISCAL_YEAR" />

<one-to-many class="Domain.Engine.Period" />

</set>

<many-to-one name="EntityRegistry" class="Domain.Core.EntityRegistry" unique="true">

<column name="NI_ENTITY_REGISTRY" not-null="false" />

</many-to-one>

<property name="Name" access="property">

<column name="NAME" not-null="false" />

</property>

<property name="Granularity" access="property">

<column name="GRANULARITY" not-null="true" />

</property>

<property name="FromDate" access="property">

<column name="FROM_DATE" not-null="true" />

</property>

<property name="ToDate" access="property">

<column name="TO_DATE" not-null="true" />

</property>

<property name="Closed" access="property" type="YesNo">

<column name="CLOSED" not-null="true" />

</property>

<property name="CreatedBy" access="property">

<column name="CREATED_BY" not-null="false" />

</property>

<property name="CreatedDate" access="property" type="timestamp">

<column name="CREATED_DATE" not-null="false" />

</property>

<property name="LastModifiedBy" access="property">

<column name="LAST_MODIFIED_BY" not-null="false" />

</property>

<property name="LastModifiedDate" access="property" type="timestamp">

<column name="LAST_MODIFIED_DATE" not-null="false" />

</property>

</class>

Оглавление книги


Генерация: 1.251. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз