Mark Seemann のブログ投稿と、それを参照するこの応答を読んで、クラス コンストラクターを介した依存性注入よりもService Locatorパターンを使用することの欠点を理解しました。また、この問題について説明している Ninject、MVC 3 およびサービス ロケーター パターンの使用による依存性注入も読みました。
ただし、私の質問はこの特定のケースに関するものです。
public class MyController
{
public void GetData()
{
using (var repository = new Repository())
{
// Use the repository which disposes of an Entity Framework
// data context at the end of its life.
}
}
// Lots of other methods.
}
ここには、内部の Entity Framework データ コンテキストを自動的にインスタンス化するリポジトリを呼び出すメソッドを含むコントローラーがあります。この単一のデータ コンテキストが使用されます。これは、コンテキストがリポジトリ内のすべてのメソッドによって呼び出されるためです。そのため、リポジトリ オブジェクトの存続期間全体にわたって単一のコンテキストを共有することが理にかなっているように思われます。
現在、コントローラ クラスが大きいため、この特定のリポジトリが使用されない可能性が高くなります。この DC のインスタンス化は高価な操作であると (おそらく間違って) 想定しているため、そうすることは避けたいと思います。サービス ロケーター パターンを使用すると、コンテキストが実際に必要になるまでインスタンス化を延期できますが、上記のリンクでそれに対する有効な引数を考えると、それを避けることをお勧めします。
したがって、私が知りたいのは、上記のケースで依存性注入を使用するより効率的な方法があるかどうかです。これにより、リポジトリと基礎となるデータ コンテキストが不必要にインスタンス化されるのを防ぐことができます。