12

C#では、エンティティが完全に変更されるまで、すべての既知のイベントの処理を遅らせるための最良の方法は何ですか?たとえば、エンティティ(MyEntity)のプロパティID、名前、説明が...であるとします。

   public class MyEntity
   {
       public Int32 ID { get; set; }
       public String Name { get; set; }
       public String Description { get; set; }
   }

これらの各プロパティを変更すると、変更ごとにイベントが発生します。

変更されるプロパティはIDだけの場合もあれば、すべてのプロパティが変更される場合もあります。「バッチ」で変更されるすべてのプロパティが変更されるまで、変更イベントの登録済みリスナーを待機させたい。

これを達成するための最良の方法は何ですか?

私の頭の中では、UnitOfWork-patternに似たもので、呼び出しスタックの最上位のメソッド呼び出しの周りにusingステートメントをラップすることは可能ですが、そのようなことを実装する方法がわかりません...

編集:説明として...リスナーはアプリケーション全体に分散しており、他のスレッドで実行されています。別のアクターは、たとえば、値を設定するためにMyEntity.Nameプロパティを呼び出す必要がある名前を設定します。

設計上、Nameプロパティを変更すると、他のプロパティが変更される可能性があります。したがって、リスナーは、プロパティの変更が完了したことを知る必要があります。

4

4 に答える 4

1

私は提案することができます

public class MyEntity
{
    private const int FieldsCount = 3;

    private Int32 id;
    private String name;
    private String description;

    private HashSet<string> dirty = new HashSet<string>();

    public Int32 ID
    {
        get { return id; }
        set
        {
            id = value;
            dirty.Add("id");
            GoListeners();
        }
    }

    //...

    private void GoListeners()
    {
        if (dirty.Count == FieldsCount)
        {
            //...
            dirty.Clear();
        }
    }

}
于 2013-03-13T13:35:29.830 に答える
0

すべてのイベントが同じ署名を使用すると仮定します。

  1. MyEntityのインスタンス化などでデリゲートeventQueueを初期化し、'queueRequiredLength'などのint値を初期化します。
  2. 各プロパティセッターは、イベントを発生させるだけでなく、まだ存在しない場合はイベントをキューに追加しますeventQueue += newEvent;
  3. 次に、各プロパティセッターはキューの長さをチェックし、デリゲート(つまり、キューに入れられたすべてのイベント)を起動します。if(length == queueRequiredLength) {eventQueue();}

(頭から離れて、デリゲートで「キューに入れられた」メソッドの数を確認する方法がわかりませんが、最悪の場合、カウンターを保持して、キューに追加するたびにそれをインクリメントすることもできます)。

于 2013-03-13T13:29:45.013 に答える