Question

Info: VS2010, DSL Toolkit, C #

J'ai un constructeur personnalisé sur une de mes classes de domaine qui ajoute quelques éléments enfants. J'ai un problème que je ne veux que cela fonctionne lorsque l'élément de classe de domaine est créé, pas à chaque fois le schéma est ouvert (qui appelle les 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();
            }
        }
    }
Était-ce utile?

La solution

Il semble que vous initialisez des propriétés de classe de domaine à partir du constructeur. Il est préférable de faire en créant un AddRule. AddRules sont invoquées lorsqu'une instance de la classe de domaine auquel ils sont attachés est ajouté au modèle. Par exemple:

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

Le AddRule doit ensuite être enregistré en remplaçant une fonction dans votre classe de modèle de domaine:

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

Pour plus d'informations sur les règles, un coup d'oeil à la. « Comment: créer des règles personnalisées » dans la documentation SDK VS

Remarque: la solution est basée sur les DSL Tools VS 2008. YMMV.

Autres conseils

Bien que l'approche correcte (Paul Lalonde réponse est le meilleur), voici comment vous savez peut-être, à un moment donné, si le modèle est sérialisé (= chargement):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top