8

私だけかどうかはわかりませんが、ASP.NET MVC コントローラーで使用されるコンストラクター インジェクションが不要なリソース消費を引き起こしているように感じます。

特定の Web 要求に使用されていないコンポーネントは、コントローラーの作成時に作成する必要があります。のどが渇いたときにブースの牛乳とジュースを買って、ジュースを捨てるようなものです。

私の懸念を明確にするために、コントローラーのコンストラクター注入とサービスロケーターのこれらの例を比較してください。

コンストラクター インジェクション、ブース deps が作成されますが、使用されるのは 1 つだけです。

public class MyController : Controller
{
    private readonly IDep1 _dep1;
    private readonly IDep2 _dep2;

    public MyController(IDep1 dep1, IDep2 dep2)
    {
        _dep1 = dep1;
        _dep2 = dep2;
    }

    public ActionResult Index()
    {
        _dep1.MakeStuff();
        return View();
    }
    public ActionResult PageTwo()
    {
        _dep2.MakeStuff();
        return View();
    }
}

Service Locator、各 dep は使用時にのみ作成されます。

public class MyController : Controller
{
    public ActionResult Index()
    {
        var dep1 = ServiceLocator.Resolve<IDep1>();
        dep1.MakeStuff();
        return View();
    }
    public ActionResult PageTwo()
    {
        var dep2 = ServiceLocator.Resolve<IDep2>();
        dep2.MakeStuff();
        return View();
    }
}

IoC コンテナー (多くの理由で有益です) は引き続き Service Locator パターンに使用できることに注意してください。IoC やコンテナー フレームワークに関する議論にしたくありません。また、コンストラクター インジェクション (依存関係の明確な可視性など) から得られるメリットもありません。私の懸念は、コンストラクター インジェクション パターンと、ASP.NET MVC コントローラーの状況でリソースを浪費する方法です。

ここでの主な質問は次のとおりだと思います: Service Locator は、上記のシナリオ (ASP.NET MVC コントローラー) のパフォーマンスに関してより優れたソリューションですか?

4

2 に答える 2

8

オブジェクトの作成がボトルネックである場合は、非常に良い状況 (他のすべてが魔法のように機能するため、1 ミリ秒未満の操作がカウントされる) または非常に悪い状況 (コンストラクターが想定外の重い作業を行っている) のいずれかです。に)。

マーク・シーマンはすでにここで主題をカバーしています: http://blog.ploeh.dk/2011/03/04/Composeobjectgraphswithconfidence/

多くの場合、いずれにせよこれらのクラスが必要なため、これはパフォーマンス ヒットです。ただし、ほとんどの場合、この懸念は無関係であると主張します。

それでも問題が解決しない場合は、可能な解決策を提供します(遅延ブランチ)。

于 2013-04-02T10:25:46.217 に答える