内部オブジェクトのイベントをサブスクライブする場所を決定する必要がある状況に頻繁に遭遇しますか?
たとえば、次のようなオブジェクトモデルがあります。
class ClassA
{
public event EventHandler SomeEvent1;
public event EventHandler SomeEvent2;
public event EventHandler SomeEvent3;
public event EventHandler SomeEvent4;
}
class ClassB
{
private ClassA a;
public ClassA A
{
get
{
return this.a;
}
}
public ClassB()
{
this.a = new ClassA();
// here subscribe to some events (for example, SomeEvent1 and SomeEvent2)
// this.a.SomeEvent1 += OnSomeEvent1Raised;
// this.a.SomeEvent2 += OnSomeEvent2Raised;
}
}
class ClassC
{
public ClassB B { get; }
}
class ClassD
{
public ClassC C { get; }
public void SomeMethod()
{
// Here subscribe to another ones events of object C.B.A. For example:
C.B.A.SomeEvent3 += OnSomeEvent3Raised;
C.B.A.SomeEvent4 += OnSomeEvent4Raised;
}
private void OnSomeEvent4Raised(object sender, EventArgs e)
{
throw new NotImplementedException();
}
private void OnSomeEvent3Raised(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
私はUML図のようなものを作成しようとしました:
私のプロジェクトの既存のコードの構造には、そのようなオブジェクトモデルが存在する場所があります(上記の例のように実装されたイベントをサブスクライブする場所があります-CBASomeEvent + =)。私はそれが好きではなく、それを変更したいと思います。この状況に関するベストプラクティスをここに示したいと思います。
別のアプローチは、classB、classC、classDのclassAのすべてのイベントを複製することです。次に、イベントへのすべてのサブスクリプションを1つの場所に置き換えます(つまり、classBでは、ClassAのオブジェクトのすべてのイベントをサブスクライブ/サブスクライブ解除します。classCでは、classBのオブジェクトのすべてのイベントをサブスクライブ/サブスクライブ解除します。 on ...)この場合、すべてのサブスクリプションとサブスクリプション解除は1か所になります。私がここで何を意味するのか理解していただければ幸いです。
繰り返しになりますが、あなたの知識と経験に頼って、この状況を解決する方法を教えてください。
アップデート
イベントのサブスクリプションとサブスクリプション解除は1つの場所に配置する必要があることに同意しますか?この追加の質問にも答えてください。
前もって感謝します。