2012-12-27 9 views
6

IoCを使用してサービス参照をコントローラに挿入し、リポジトリ参照をサービスに挿入するASP.NET MVCアプリケーションがあります。IoCを使用すると、シングルトンにTransient Lifetimeを持つオブジェクトを注入できますか?

コントローラは、要求ごとにインスタンス化する必要があるため、一時的な存続期間が必要です。 IoCスタック全体が要求ごとに新しくなっている場合は、オーバーヘッドになります。私は、より多くの依存関係を持っています。一つの選択肢は、より多くのコントローラを持ち、それぞれがスタック内の依存性がより少ないことです。しかし、今のところそれを残しておいて、私の質問は、シングルトンとして注入されたオブジェクトに一時的な寿命がある依存関係がある場合、これらの依存関係はシングルトンによって所有されているためシングルトンのように扱われるのでしょうか?私たちは、次の

RepositoryAを持っている場合(シングルトン) ControllerA(過渡)が

ので、同じようにインスタンス化 SERVICEA

具体的には、(現在のデザインは、コンストラクタでユーザーコンテキストを注入するので、過渡にする必要がある):

public ServiceA(IRepositoryA repo) {} 
public ControllerA(IServiceA service) {} 

ServiceAが一度インスタンス化されるため、RepositoryAは基本的に一度インスタンス化されますか?

回答は「はい」ですが、ここで行う必要があるリファクタリングの量を確認したかっただけです。

また、設計アプローチとしてサービスとリポジトリにユーザー/リクエスト固有のインスタンス変数がないと仮定すると、シングルトンのライフタイムを使用しない理由はありますか?

+0

本当の質問はなぜシングルトンである必要があるのでしょうか? – dotjoe

+0

@dotjoeそれは本当の質問ではありませんが、それでもなお非常に良い点です:-)。そのようなサービスがシングルトンとして構成されていることは私には奇妙に思えます。パフォーマンス上の問題はありますか? – Steven

+0

さらに、ビジネスロジックを含む 'Service'クラスの使用は、私が最近避けたいものです。興味のある方は、[この記事ではビジネスオペレーション/メッセージをメッセージとして定義する方法について説明しています](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)をご覧ください。 – Steven

答えて

4

シングルトンが過渡寿命を有する 依存性を有するように注入されたオブジェクトは、これらの依存性は、本質的にシングルトンによって所有されることによってシングルトンよう に扱われますか?

これは正しいです。このようなコンポーネントは依存関係を保持するため(プライベートフィールドに参照を格納することにより)、コンポーネント自体が保持する限り、依存関係は存続します。言い換えれば、それらの寿命は、コンポーネントの寿命まで暗黙的に(寿命が短い場合)促進される。

これをお持ちの場合は、DI構成が間違っています。遅かれ早かれこのバグが表示されます。おそらく、プロダクションだけで、あなたの開発マシンではほとんどありません。

一般に、コンテナによって管理されるすべてのコンポーネントは、コンポーネント自体よりも寿命が長いアブストラクションにのみ依存する必要があります。

一部のフレームワークでは、これらの種類の構成エラーを検出するための分析サービスも用意されています。それにもかかわらず、すべての依存関係を結びつけるときは非常に注意が必要です。一般的に、過渡コンポーネントにはあらゆるライフスタイルの依存関係が含まれるため、可能な限りコンポーネントを一時的に構成するのが最も安全です。多くの一時的なオブジェクトを持つことは、通常、パフォーマンスの問題ではありません。 Web要求ごとにかなり大きなオブジェクトグラフを作成するのは、通常は十分に速いでしょう(それ以外の場合はDI framework with a higher throughputに切り替えてみてください)。

+0

DIフレームワークリンクのおかげで(Simple Injector( - ;)のために働いていることが完全にわかるはずですが)、この時点で切り替えが難しいかもしれませんが、魅力的です。 – sydneyos

+0

Simple Injectorを開発しました。 。リンクはSIを促進するのではなく、さまざまなフレームワークの特徴を理解するためのものでした。ただし、フレームワークの切り替えが難しい場合は、アプリケーションの設計を見直さなければならない場合があります。アプリケーションがフレームワークにあまりにも依存している可能性があります。これにより、アプリケーションの保守性とテスト容易性が損なわれます。 Simple Injectorは私のDIのニーズに合っていますが、SIに直接依存する必要はありません。自分のアプリケーションであっても。 – Steven

関連する問題