</Operation></Entity>
<Entity name ="Period">
<Doc><Label lang ="ru">Учётный период</Label></Doc>
<Attribute name ="Id" type ="TEntityId" primaryid ="true" autoincrement ="true" />
<UniqueId>
<Attribute name ="FiscalYearId" type ="TEntityId">
<Doc><Label lang ="ru">ID финансового года</Label></Doc>
</Attribute>
<Attribute name ="FromDate" type ="date">
<Doc><Label lang ="ru">Дата начала</Label></Doc>
</Attribute>
</UniqueId>
<UniqueId>
<OnAttribute name ="FiscalYearId"/>
<Attribute name ="PeriodNumber" type ="smallint">
<Doc><Label lang ="ru">Номер периода</Label></Doc>
</Attribute>
</UniqueId>
<Attribute name ="ToDate" type ="date">
<Doc><Label lang ="ru">Дата окончания</Label></Doc>
</Attribute></Entity>
<Relation entity ="Period" name ="FiscalYear"
entity2 ="FiscalYear" name2 ="Periods"
cardinality ="M:1">
<AttributeMatch attribute ="FiscalYearId" attribute2 ="Id" /></Relation>
Теперь необходимо задать конфигурацию в описании проекта. Предположим, что мы хотим создать 3-звенное приложение со следующими логическими слоями:
• слои хранения будут развёрнуты на SQL Server или Oracle;
• слой домена под управлением NHibernate;• слой веб-служб на базе ServiceStack (вместо WCF, имеющего под Mono/Linux ограничения).
Пример конфигурации проекта в Genie Lamp
<! – Включаем файл(ы) модели в проект – >
<ImportModel fileName ="MyModel.xml" />
<! – Будем использовать джинна SQL Server – >
<Genie name ="SqlServer"
type ="GenieLamp.Genies.SqlServer.SqlServerGenie"
assembly ="GenieLamp.Genies.SqlServer"
active ="false"
outDir ="%PROJECT_DIR%/../SQL/SqlServer-%TARGET_VERSION%"
outFileName ="%PROJECT_NAME%.sql"
updateDatabase ="true"
targetVersion ="2008">
<Param name ="Database.Create" value ="false" />
… Другие параметры "заклинания"</Genie>
<! – Будем использовать джинна Oracle – >
<Genie name ="OracleDb"
type ="GenieLamp.Genies.Oracle.OracleGenie"
assembly ="GenieLamp.Genies.Oracle"
active ="true"
outDir ="%PROJECT_DIR%/../SQL/Oracle-%TARGET_VERSION%"
outFileName ="%PROJECT_NAME%.sql"
outFileEncoding ="iso-8859-1"
updateDatabase ="false"
targetVersion ="10g">
<Param name ="UniqueIndexConstraint" value ="true" />
…</Genie>
<! – Будем использовать джинна NHibernate для генерации домена – >
<Genie name ="NHibernate"
type ="GenieLamp.Genies.NHibernate.NHibernateGenie"
assembly ="GenieLamp.Genies.NHibernate"
active ="true"
outDir ="%PROJECT_DIR%/../Domain"
outFileName ="%PROJECT_NAME%.Domain.cs"
targetVersion ="*">
<Param name ="TargetAssemblyName" value ="Company.Business.%PROJECT_NAME%.
Domain" /></Genie>
<! – Будем использовать первого джинна ServiceStack
для генерации интерфейсов к веб-службам – >
<Genie name ="ServiceStack Services Interfaces"
type ="GenieLamp.Genies.ServicesLayer.ServiceStack.ServicesInterfacesGenie"
assembly ="GenieLamp.Genies.ServicesLayer"
active ="true"
outDir ="%PROJECT_DIR%/../Services.Interfaces"
targetVersion
="*"></Genie>
<! – Будем использовать второго джинна ServiceStack
для генерации собственно веб-служб – >
<Genie name ="ServiceStack Services"
type ="GenieLamp.Genies.ServicesLayer.ServiceStack.ServicesGenie"
assembly ="GenieLamp.Genies.ServicesLayer"
active ="true"
outDir ="%PROJECT_DIR%/../Services"
targetVersion ="*"></Genie>
<Configuration>
<! – Конфигурация слоя хранения данных – >
<Layer name ="Persistence">
<NamingConvention style ="uppercase" maxLength ="30">
<Param name ="PrimaryKey.ColumnTemplate" value ="NI%TABLE%" />
<Param name ="PrimaryKey.ConstraintTemplate" value ="PK_%TABLE%" />
… Другие шаблоны именований
</NamingConvention>
<Param name ="ForeignKey.CreateIndex" value ="true" />
<Param name ="BooleanValues" value ="YesNo"/></Layer>
<! – Конфигурация слоя домена – >
<Layer name ="Domain">
<Param name ="BaseNamespace" value ="Company.Business.%PROJECT_NAME%" />
</Layer>
<! – Конфигурация слоя служб – >
<Layer name ="Services">
<Param name ="BaseNamespace" value ="Company.Business.%PROJECT_NAME%" /></Layer>
<! – Шаблон "Реестр объектов" – >
<Pattern name ="Registry">
<Param name ="Schema" value ="Core" />
<Param name ="PersistentSchema" value ="CORE" />
<Param name ="RegistryEntity.Name" value ="EntityRegistry" />
<Param name ="TypesEntity.Name" value ="EntityType" />
<Param name ="TypesEntity.PrimaryId.Type" value ="smallint" />
<Param name ="PrimaryId.Type" value ="bigint" /></Pattern>
<! – Шаблон "Версия состояния" для хранимых объектов – >
<Pattern name ="StateVersion">
<Param name ="Attribute.Name" value ="Version" />
<Param name ="Attribute.Type" value ="int" /></Pattern>
<! – Шаблон "Аудит" для минимального отслеживания изменений – > <Pattern name ="Audit" />
<! – Шаблон "Локализация" – > <Pattern name ="Localization" />
<! – Шаблон "Безопасность" для веб-служб – >
<Pattern name ="Security" /></Configuration>
В описании конфигурации джиннов видно, что его основу составляет сборка, один из классов которой, реализующий интерфейс IGenie, является точкой входа. Каждый джинн имеет как общие для всех параметры, например каталог для выходных файлов, так и специфичные, передаваемые через тег Param, описываемые в документации.