2012-02-01 20 views
2

私はファクトリを使用して、インターフェイスの異なる具体的インスタンスを作成しています。具体的なインスタンスの1つは、通常注入されるサービスに依存します。サービスのライフサイクルはコンテナによって管理されます。この場合、コンテナを工場に注入することはできますか?容器を工場に注入しても問題ありませんか?

+5

moarcode plox nom nom nom nom nom – Yuck

答えて

2

私は、コンテナに抽象ファクトリ、ファクトリインターフェイス、またはファクトリデリゲートを解決させ、代わりにコンシューマにそれを挿入させます。

この場合、工場は依存関係としてサービスを受け取り、工場で解決します。コメントに基づいて

更新:

あなたは工場出荷時にサービスを注入している場合は、そのサービスの同じ インスタンスは、工場が作成した各オブジェクトに渡されることはありませんか?

はい、工場で作成された各オブジェクトは、サービスの同じインスタンス(通常は私が望むもの)を取得します。それがではない場合は、をご希望の場合は、サービスファクトリを工場に挿入してください。いくつかのコンテナは工場の代理人を自動的に解決するためのサポートを提供するので、Func<IFooService>を注入することができます。

しかし@SebastianWeberはコメントで述べたように、サービスのライフサイクルが 工場

のライフサイクルにバインドされ、その後、それがすべてのコンテナの制限ではありません。また、それが重要かどうか検討してください。あなたは2つのライフスパンのうち最短のものを選んで両方のライフスパンに使うことができます。

+0

しかし、サービスのライフサイクルは工場のライフサイクルに結びついています – JontyMC

+1

@JontyMC誰に言いますか?私が知っている限り、それはCastle WindsorのTyped Factory Facilitiesの唯一のケースです。他のコンテナでは、サービスのライフサイクルを工場のライフサイクルとは別に定義できます。 –

+0

サービスを工場に注入している場合、そのサービスの同じインスタンスは、工場が作成する各オブジェクトに渡されませんか? – JontyMC

2

この場合、容器を工場に注入することはできますか?

確かです。しかしの場合、その工場実装はComposition Rootの内部にあります。そのファクトリがアプリケーション自体にある場合(つまり、の外にのComposition Root)、サービスロケータとしてコンテナを使用しています。これはan anti-patternであり、避けるべきです。

+0

私はそれを合成ルートの外で使用する必要があります。工場を使用しているときに、コンテナを介してライフサイクルを管理するにはどうすればよいですか? – JontyMC

+0

なぜ構図ルートの外側でそれを使用する必要があると思いますか?通常、あなたの 'IMyFactory'インターフェースはアプリケーションレベルで定義され、' MyFactoryImplementation'は合成ルートの中で定義されます。これがうまく行かない場合は、いくつかのコードを表示してください。 – Steven

関連する問題