0

信息:VS2010、DSL 工具包、C#

我的一个域类上有一个自定义构造函数,它添加了一些子元素。我有一个问题,因为我只希望在创建域类元素时运行它,而不是每次打开图表时(调用构造函数)

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

2 回答 2

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 工具。YMMV。

于 2009-09-23T11:52:12.233 回答
0

虽然不是正确的方法(Paul Lalonde 的答案是最好的),但您可以在任何给定时间知道模型是否正在序列化(= 加载):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
于 2009-10-07T17:26:37.980 回答