2009-09-22 3 views
0

Info: VS2010, DSL Toolkit, C#DSL Constructor sur mesure - seulement appeler lors de sa création ne se charge pas

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

Répondre

2

Il semble que vous initialisez des propriétés de classe de domaine de dans le constructeur. Cela est mieux fait en créant une AddRule. AddRules sont invoqués lorsqu'une instance de la classe de domaine à laquelle ils sont attachés est ajoutée 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 alors ê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 section « Comment: créer "Règles personnalisées" dans la documentation VS SDK.

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

+0

Merci Paul pour votre réponse. Je vais faire des tests maintenant! –

+0

Cela fonctionne, très apprécié. Il y a beaucoup à apprendre en DSL mais je trouve que ça en vaut vraiment la peine –

+0

Comme une question semi-latérale. Si je voulais faire quelque chose de simulaire pour quand le diagramme est créé (Projet> Ajouter un élément) devrais-je utiliser le constructeur alors ou dois-je utiliser le même modèle qu'ici? Merci –

0

Bien que l'approche correcte (réponse Paul Lalonde est le meilleur), est ici 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 
Questions connexes