Pergunta

Info: VS2010, DSL Toolkit, C #

Eu tenho um construtor personalizado em uma das minhas classes de domínio, que acrescenta alguns elementos filhos. Eu tenho um problema como eu só quero isso para ser executado quando o elemento de classe de domínio é criado, não toda vez que o diagrama é aberto (que chama os construtors)

        public Entity(Partition partition, params PropertyAssignment[] propertyAssignments)
        : base(partition, propertyAssignments)
    {
        if (SOMETHING_TO_STOP_IT_RUNNING_EACH_TIME)
        {
            using (Transaction tx = Store.TransactionManager.BeginTransaction("Add Property"))
            {
                Property property = new Property(partition);
                property.Name = "Class";
                property.Type = "System.String";
                this.Properties.Add(property);
                this.Version = "1.0.0.0"; // TODO: Implement Correctly
                tx.Commit();
            }
        }
    }
Foi útil?

Solução

Parece que você está inicializando algumas propriedades da classe de domínio a partir do construtor. Este é o melhor feito através da criação de um addRule. AddRules são invocados quando uma instância da classe domínio ao qual estão ligados, é adicionado ao modelo. Por exemplo:

[RuleOn(typeof(Entity), FireTime = TimeToFire.TopLevelCommit)]
internal sealed partial class EntityAddRule : AddRule
{
  public override void ElementAdded(ElementAddedEventArgs e)
  {
    if (e.ModelElement.Store.InUndoRedoOrRollback)
      return;

    if (e.ModelElement.Store.TransactionManager.CurrentTransaction.IsSerializing)
      return;

    var entity = e.ModelElement as Entity;

    if (entity == null)
      return;

    // InitializeProperties contains the code that used to be in the constructor
    entity.InitializeProperties();
  }
}

O addRule então precisa ser registrado, substituindo uma função na sua classe de modelo de domínio:

public partial class XXXDomainModel
{
  protected override Type[] GetCustomDomainModelTypes()
  {
    return new Type[] {
      typeof(EntityAddRule),
    }
  }
}

Para obter mais informações sobre regras, ter um olhar para o.: Tópico "Como criar regras personalizadas" na documentação VS SDK

Nota: a solução é baseada nos DSL Tools VS 2008. YMMV.

Outras dicas

Apesar de não ser a abordagem correta (Paul Lalonde resposta é o melhor), aqui está como você deve saber, a qualquer momento, se o modelo está sendo serializada (= carregamento):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top