DSLカスタムコンストラクタ - 作成したときにのみ呼び出しロードしません

StackOverflow https://stackoverflow.com/questions/1459653

質問

インフォメーション:VS2010、DSLツールキット、C#

私はいくつかの子要素を追加して自分のドメインクラスのいずれかにカスタムコンストラクタを持っています。私は、これはドメインクラス要素が作成されたとき(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();
            }
        }
    }
役に立ちましたか?

解決

あなたは、コンストラクタの中から、いくつかのドメインクラスのプロパティを初期化しているように、

に見えます。これは、最高の追加ルールを作成することによって行われます。それらが結合しているドメイン・クラスのインスタンスがモデルに追加されたとき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();
  }
}

追加ルールは、ドメインモデルクラスに機能をオーバーライドして登録する必要があります:

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

ルールの詳細については、「方法:カスタムルールの作成」を見ています。VS SDKのドキュメントでトピックを

注:この溶液をVS 2008 DSLツールに基づいています。 YMMV。

他のヒント

正しいアプローチではないが、(ポール・ラロンドの答えが最良です)、 こちらのモデルは、直列化されている場合、任意の時点で、あなたが知っているかもしれない方法です(=ロード):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top