DSL Constructor sur mesure - n'appeler lors de la création ne se charge pas
-
12-09-2019 - |
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();
}
}
}
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