2009-09-22 153 views
0

信息:VS2010,DSL工具包,C#DSL自定义构造函数 - 只调用创建不加载时

我有它增加了一些子元素我的领域类的一个自定义构造函数。我有一个问题,我只希望这不是图打开每次(它调用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(); 
      } 
     } 
    } 

回答

2

看起来要初始化一些领域类的属性在构造函数中。这最好通过创建一个AddRule来完成。当它们所连接的域类的实例被添加到模型中时,就会调用AddRules。例如:

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

然后AddRule需要在您的域模型类中重写功能进行注册:

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

有关规则的详细信息,看看在“如何创建自定义规则“VS SDK文档中的主题。

注意:该解决方案基于VS 2008 DSL工具。因人而异。

+0

谢谢保罗为你答复。我现在要做一些测试! – 2009-09-23 14:20:43

+0

它的工作原理,非常感谢。在DSL中学习很多,但我发现它确实值得努力 – 2009-09-23 14:56:29

+0

作为一个半边问题。如果我想在创建图的时候做一些类似的事情(Project> Add Item),那么我应该使用构造函数吗?还是应该使用与这里相同的模式?谢谢 – 2009-09-23 15:34:08

0

虽然不是正确的做法(保罗·拉隆德的回答是最好的), 这里是你如何可以知道,在任何给定的时间,如果模型被序列化(=加载):

this.Store.TransactionManager.CurrentTransaction!= null && 
this.Store.TransactionManager.CurrentTransaction.IsSerializing 
相关问题