WinFormsタブ付きMDIインターフェイスを使用してC#でLOBアプリケーションに取り組んでいます。DataGridViewsにはさまざまなフォームがあり、ユーザーが関心のあるオブジェクトを選択して、新しいフォームで表示/編集できるようになっています。
私の主なビジネスオブジェクトはそれぞれ、以下のように定義されているEntityを継承しています。
public abstract class Entity
{
public static event Action Saved;
internal virtual void OnSaved()
{
if (Saved != null)
{
Saved();
}
}
}
次に、グリッドにデータを取り込むオブジェクトがあります(これらは、実際にはLinqからSQLに自動生成されたクラスですが、通常のクラスで問題を再現できます)。
class Class1 : Entity
{
//Stuff
}
class Class2 : Entity
{
//Stuff
}
特定のクラスのオブジェクトがいつ変更されるかを知りたいのですが、グリッドを更新して他のアクティビティを実行できるように、どのインスタンス(したがって静的アクション)を気にしません。
問題は、イベントが派生クラスインスタンスから発生したときに発生します。他のすべての派生クラスに対しても発生します。例えば:
Class1.Saved += new Action(s1);
Class2.Saved += new Action(s2);
private void TestIt()
{
Class2 o2 = new Class2();
o2.OnSaved();
}
これはs1とs2を起動しますが、特定の1つ(つまりs2)のみを起動する必要があります。これを行うための最良の方法は何ですか?この動作を必要とするクラスがかなりあり、可能であれば各クラスにコードを追加する必要はありません。
アップデート:
たくさんのご回答ありがとうございました。とても参考になりました。
私は少し異なるオプションを選択しました。これはかなりハッキーに思えますが、私の目的にはうまく機能します。これには、アクションでタイプを渡し、ハンドラーにフィルターをかけて関連する操作を呼び出させることが含まれます。
エンティティクラス:
public abstract class Entity
{
public static event Action<Type> Saved;
internal void OnSaved()
{
private Action<Type> SavedCopy = Saved;
if (SavedCopy != null)
SavedCopy(this.GetType());
}
}
ハンドラーを接続します:
Entity.Saved += new Action<Type>(Handler);
ハンドラーメソッドの例(これはフォームごとに異なります):
void Handler(Type obj)
{
if (obj==typeof(Class1))
UpdateGrid();
else if (obj==typeof(Class2))
UpdateBasicInfo();
else if (obj == typeof(Class3))
DoAnotherThing();
}