0

情報: VS2010、DSL ツールキット、C#

ドメイン クラスの 1 つに、いくつかの子要素を追加するカスタム コンストラクターがあります。ダイアグラムが開かれるたびにではなく(コンストラクターを呼び出す)、ドメインクラス要素が作成されたときにのみこれを実行したいので、問題があります

        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 に答える