2009-09-22 184 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 
相關問題