Geração de Código
O propósito principal da Framework de Modelação é o de acelerar o desenvolvimento de aplicação através da geração automática de uma grande porção do código necessário, de acordo com uma arquitetura pré-definida.
Isto é alcançado pelos vários text templates T4 (Text Template Transformation Toolkit) incluídos nas soluções dos módulos e dos produtos pela Factory.
Um TT (text template) usa uma sintaxe idêntica às páginas ASP tradicionais que mistura o output de texto com expressões de código C# embebidas.
<#
foreach (var entity in entities.OrderBy(ent => ent.Name))
{
WritePocoClass(moduleName, namespaceModule, entity.GetEntityInfo(), false, entity, null);
}
#>
#region <#= moduleName #>UserFieldValue
/*
/// <summary>
/// Provides a local implementation of the <see cref="UserFieldValue"/> type.
/// </summary>
public partial class <#= moduleName #>UserFieldValue : UserFieldValue
{
}
*/
#endregion
Quando combinados com as DSL Tools, esses text templates podem aceder aos modelos de objetos dos modelos para os transformar no código gerado.
Os text templates nos projetos definem o modelo de input e referenciam o template concreto, distribuído pelo SDK e embebido na assembly Primavera.Modeling.CodeGeneration.
<#@ EntitiesModel3 processor="EntitiesModel3DirectiveProcessor" requires="fileName='..\..\Models\Models\EntitiesModel.ed3'" #>
<#@ include file="v3\Entities\Business.Entities.tt" #>
Os templates concretos fazem a transformação do modelo no código gerado usando a sintaxe T4 e manipulando um mais dos modelos de input.
<#+
// *** WritePocoClass
public void WritePocoClass(
string moduleName,
string namespaceModule,
EntityInfo entityInfo,
bool isExternal,
object entity,
IEnumerable<Interface> interfaces)
{
#>
#region <#= entityInfo.Name #>
<#+
// Write entity annotations
WritePocoDefinition(moduleName, entityInfo, isExternal, interfaces);
#>
{
#region Code
#region Members
<#+
// Write entity members
WritePocoMembers(moduleName, entityInfo, isExternal);
#>
O resultado é o código gerado, em um ou mais ficheiros do projeto, em qualquer formato pretendido (código C#, SQL, XML, json, etc.).
namespace Primavera.Identity.Domain
{
#region Classes
#region Account
/// <summary>
/// Account
/// </summary>
[System.Serializable]
[System.ComponentModel.DataAnnotations.Schema.Table("Identity.Accounts")]
[Primavera.Core.Annotations.Deletable(true)]
[System.CodeDom.Compiler.GeneratedCode("AthenaCodeGenerator", "3.0.0.0")]
[Primavera.Core.Annotations.BusinessEntity("a2edeeec-0a66-4e01-9ac5-90e792fe0024", "Identity", "Accounts")]
[Primavera.Core.Annotations.CompositionSource("Identity", "AccountSubscription", "AccountSubscriptions", "Account", "AccountId")]
public partial class Account : MasterBusinessEntityBase
{
#region Code
#region Members
private string accountKey;
private ICollection<AccountSubscription> accountSubscriptions;
private string description;
(...)