DSL Personalizado Construtor - única chamando quando não estiver criado carregamento
-
12-09-2019 - |
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();
}
}
}
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