私はいくつかの解決策を見つけたのはシンプルな "問題"だと思っていますが、C#のベストプラクティスに行く方法はわかりません。C#::イベントまたはインターフェイスを処理するイベントから派生したオブジェクトのコレクションを使用する場合
私は、マスターオブジェクト(シングルトンなど)がアプリケーションの有効期間中に一度インスタンス化されています。この「MasterClass」は、MasterClass.Instance.CreateSlaveObjectが呼び出されるたびに「SlaveClass」という新しい種類のオブジェクトを作成します。
このMasterClassは、他のオブジェクトのステータス変更も監視し、変更が発生した場合は、変更の作成したSlaveClassオブジェクトに通知します。シンプルだと思われる。
私はネイティブC++の世界から来たので、私は「SlaveClassを」派生
Interface IChangeEventListener
{
void ChangeHappened();
}
そこからインターフェイスを持つように最初にそれをやった方法。それから私の "MasterClass"で私は持っています:
...
IList<IChangeEventListener> slaveList;
...
CreateSlaveObject
{
...
slaveList.Add(slave);
}
...
ChangeHappened()
{
...
foreach(var slave in slaveList)
{
slave.ChangeHappened();
}
}
これは動作します。しかし、これをやるための別の(より良い)方法があれば、私は心の後ろで不思議に思っていました。だから私はトピックについてもう少し研究し、C#イベントを見た。
したがって、MasterClassにスレーブのコレクションを保持する代わりに、基本的にMasterClassをSlaveClassのctor(またはプロパティを介して)に挿入し、SlaveClassオブジェクトにChangeHappenedをイベントハンドラとして追加させます。
...Master...
public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args);
public event NewUpdateDelegate ChangeHappenedEvent;
....
public SlaveClass (MasterClass publisher) //inject publisher service
{
publisher.ChangeHappenedEvent += ChangeHappened;
}
しかし、これはスレーブとマスターとの間に不必要なカップリングのようなもののようですが、私は提供ビルドでのイベント通知メカニズムの優雅さを好む:これが示されることになります。
私は現在のコードを保持するか、イベントベースのアプローチ(パブリッシャー注入)に移行する必要がありますか?なぜ?
また、私が逃したかもしれない代替ソリューションを提案できれば、私もそれに感謝します。
ニート!私はあなたがMasterClassに提案したアプローチが本当に好きですが、イベントの仕組みを維持しています:)私が見る問題はあなたが尋ねたように、スレーブがマスターと同じくらい長く生きるという保証はありません...だから私はスレーブデストラクタでイベントをアンフックしたい場合、私はカップリングを戻すでしょう:/ – Futurist
まあ、代替があります、私の答えを変更させてください。 –
返信ありがとうございました。私はまだ私に慣れていないいくつかの概念(弱参照のような)があるので、これを熟考します。 – Futurist