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;

        (...)