Дефрагментация мозга. Софтостроение изнутри
Шрифт:
Пример модели в Genie Lamp
<Type name ="TEntityId" baseType ="int" />
<Enumeration name ="Granularity">
<Doc><Label lang ="ru">Грануляция учётного периода</Label></Doc>
<Item name ="Day" value ="0">
<Doc><Label lang ="ru">День</Label></Doc>
</Item>
<Item name ="Month" value ="1" default ="true">
<Doc><Label lang ="ru">Месяц</Label></Doc>
</Item>
<Item name ="Year" value ="2">
<Doc><Label lang ="ru">Год</Label></Doc>
</Item>
</Enumeration><Entity name ="FiscalYear">
<Doc><Label lang ="ru">Финансовый
<Attribute name ="Id" type ="TEntityId" primaryid ="true" autoincrement ="true" />
<Attribute name ="Name" type ="TCaption" uniqueid ="true">
<Doc><Label lang ="ru">Обозначение года</Label></Doc>
</Attribute>
<Attribute name ="Granularity" type ="Granularity">
<Doc><Label lang ="ru">Грануляция периодов</Label></Doc>
</Attribute>
<Attribute name ="FromDate" type ="date">
<Doc><Label lang ="ru">Дата начала</Label></Doc>
</Attribute>
<Attribute name ="ToDate" type ="date">
<Doc><Label lang ="ru">Дата окончания</Label></Doc>
</Attribute>
<Attribute name ="Closed" type ="boolean" default ="false">
<Doc><Label lang ="ru">Год закрыт?</Label></Doc>
</Attribute>
<Attribute name ="GranularityName" type ="string" persisted ="false">
<Doc>
<Text lang ="ru">Возвращает локализованое название грануляции</Text>
</Doc>
</Attribute>
<Operation name ="CreatePeriods" access ="public">
<Doc>
<Text lang ="ru">Создает периоды финансового года
между датами начала и окончания
в соответствии с грануляцией. Например, для фин. года,
совпадающего с календарным, и помесячной грануляцией
будут созданы 12 месячных периодов
</Text>
</Doc>
<Returns type ="void"/>
</Operation>
<Operation name ="FindPeriodIdByDate" access ="public">
<Doc>
<Text lang ="ru">
Возвращает ID периода по заданной дате, "0" если не найден
</Text>
</Doc>
<Param name ="periodDate" type ="datetime"/>
<Returns type ="TEntityId"/>
</Operation>
<Operation name ="DeleteCascade" access ="public">
<Returns type ="void"/>
</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>