0

一般的に、コンストラクタインジェクションを使用し、コンテナを自分のクラスに注入しないように、依存性注入フレームワークを試します。しかし、メッセージプロセッサの複数のインスタンス(処理スレッドごとに1つ)を作成する必要があるため、コンストラクタインジェクションを使用してそれらのプロセッサをインスタンス化することはできません。ユニティフレームワークを使用してクラスの複数のインスタンスをインスタンス化するための最適なデザインパターン

もちろん、私は容器を注入してそれを使ってプロセッサを解決することができますが、多くはそれが反パターンであると言われています。代わりに、それらのためのファクトリを作成し、ファクトリを解決し、それを使ってプロセッサを構築することもできます。しかし、タイプを正しく構築するためにパラメータを必要としなくても、注入したいタイプごとに別々のファクトリを用意する必要があるので、オーバーヘッドのように思えるので、代わりにコンテナを挿入する傾向があります。このシナリオを処理する最良の方法について他の人が考えていますか?

ご協力いただきありがとうございます。

+0

'Func 'を挿入しようとしましたか? 'T'が登録されている場合、Unityは' Func 'をどのように注入するかを知っています。スレッドごとにメッセージプロセッサを作成する方法を示すコードを提供できますか? –

+0

ありがとう!これは私のために働いています。カスタムファクトリクラスを宣言することなくIMessageProcessorを構築するファクトリを作成しています。残念ながら、これはコメントとして入力されているため、解決策としてマークすることはできませんが、これで問題は解決しました。 – user756366

答えて

0

あなたが参照しているアンチパターンは、Service Locatorと呼ばれています。コンテナの依存関係がService Locationの形式であるかどうかは、それをどこで使用するかによって異なります。これは、Service Locatorが約the role, not about the mechanicsであるためです。したがって、Composition Rootの中にあるすべてのコードに対してコンテナを自由に使用できます。それはその場であなたのためのインスタンスを作成するための容器を使用して結構ですが、

は、それは一般以来、コンポーネントを作成bad to have application-accessible factory abstractionsです:

サービスの抽象化は、その定義内の他のサービスの抽象化を公開するべきではありません

代わりに、そのようなメッセージプロセッサをオンザフライで作成する必要がある場合、これはコンシューマの懸念事項ではありません。余分な抽象化を作成するだけでコードが複雑になります。したがって、実行時にコンテナにコールバックするメッセージプロセッサ(Composition Rootで定義されています)用のプロキシインプリメンテーションを作成して、一時的なメッセージプロセッサの実装を作成したいとします。そのプロキシを実際のメッセージプロセッサではなくコンシューマに注入し、プロキシとリアルプロセッサの両方が同じインタフェースを実装するので、消費者はこれについて知りません。

+0

ありがとうございます。私は提案に関してちょっと混乱しています。コンポジションルートでプロキシクラスを宣言することを本当に意味するのであれば、メッセージプロセッサクラスをどのように置き換えることができるかを見ていますが、必要な複数のインスタンスを作成する方法を教えてください。上記のコメントのFunc 形式は、手動で宣言することなく、必要なファクトリをオンザフライで作成できるように思われます。良い解決策ではない理由はありますか?どうもありがとう! – user756366

+0

@ user756366 Func の使用には何も問題はありませんが、上記の理由と参照された記事のために、このFuncをアプリケーションコンポーネントに直接注入しないでください。代わりに、このFuncをプロキシ実装の背後に隠す必要があります。多くのプロキシー・インプリメンテーションを作成する必要がある場合は、コード・ベースに共通の抽象化がいくつか欠けています。 – Steven

+0

ありがとう!私は理解し始めているかもしれません...消費者が見たDTO(またはCommand)だけで、複数のIMessageProcessorsの代わりに1つのMessageProcessingControllerを消費者に公開する必要があると思います。コントローラはIMessageProcessorsを内部的に作成できます。これは実際にIMessageProcessorロジックをコントローラに移動できるので、私の問題を解決します。しかし、コントローラにコンテナがまだ必要な場合は、私はコントローラがどのように構築されるのか混乱しています。Unityをバイパスしてコントローラを手動でインスタンス化すると言っていますか? – user756366

関連する問題