Domanda

Info: VS2010, DSL Toolkit, C #

Ho un costruttore personalizzato su una delle mie classi di dominio che aggiunge alcuni elementi figlio. Ho un problema in quanto voglio solo questo da eseguire quando si crea l'elemento di classe di dominio, non ogni volta che il diagramma è aperto (che chiama i 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();
            }
        }
    }
È stato utile?

Soluzione

Sembra che si inizializza alcune proprietà della classe di dominio da all'interno del costruttore. Questo è fatto meglio creando un AddRule. AddRules vengono richiamati quando un'istanza della classe dominio a cui essi sono attaccati viene aggiunto al modello. Ad esempio:

[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();
  }
}

L'AddRule deve quindi essere registrati mediante l'override una funzione nella classe modello di dominio:

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

Per ulteriori informazioni sulle regole, hanno uno sguardo al.: Argomento "Come creare regole personalizzate" nella documentazione VS SDK

Nota: la soluzione è basata su Strumenti DSL VS 2008. YMMV.

Altri suggerimenti

Anche se non è l'approccio corretto (Paul Lalonde risposta è la migliore), ecco come si può sapere, in qualsiasi momento, se il modello è stato serializzato (= carico):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top