web-dev-qa-db-ja.com

依存関係注入コンテナーを使用してオブザーバーをオブザーバブルに自動的に接続する

オブザーバーインターフェイスを実装するいくつかのサービスと、対応するオブザーバブルインターフェイスを実装する1つのサービスがあります。

私は現在Prismと一緒にUnityを使用しているので、この組み合わせを維持したいと思います。私の現在の解決策は、オブザーバーサービスにオブザーバブルサービスを挿入し、オブザーバーにサブスクライブさせることです。オブザーバーはオブザーバブルに実際には依存していないので、これが良い設計かどうかはわかりません。

依存関係注入コンテナーを使用してこれらを自動的に結合する方法はありますか?別の方法はありますか?

2
Jef Patat

現在の設計の利点は、オブザーバーが観察しているときに制御できることです。オブザーバーが監視を開始したい場合は、registerメソッドを呼び出してそれ自体への参照を渡すことにより、監視対象オブジェクト(件名)に登録(または、必要に応じてサブスクライブ)します。

オブザーバー内:

subject.register(this)

後で

subject.unregister(this)

あなたはこれが不必要な依存関係を作成することを心配しています。ここでの唯一の依存関係は、呼び出される登録および登録解除メソッドであることを保証するサブジェクトインターフェイスです。ああ、あなたは主題への参照が必要です。

したがって、依存関係の問題ではありません。それは、オブザーバーがいつ観察するかを決定する責任があるかどうかの問題です。

オブザーバーがいつオブザーバーを観察するかを決定したくない場合は、その責任を負う3つ目の事項が必要です。

オブジェクトグラフを構築するときに、サブジェクトにオブザーバーのリストを提供することができます。サブジェクトのセッターを何度も呼び出すか、可変数の引数を取るコンストラクターを呼び出すか、オブザーバーのコレクションを渡す必要があります。

DIコンテナーがこれらのいずれかを実行できる場合、それは「いくつかの3番目のこと」になります。そうでない場合は、「いくつかの3番目のもの」として機能する構築コードを記述する必要があります。

3
candied_orange