2017-03-06 5 views
0

autofacまたはninjectのようなIOCコンテナによって注入されるサービスを使用するコントローラがあるとします。サービスは、ビューを呼び出すだけの単純なアクションをトリガーしたい場合でも、要求がそのコントローラーにヒットするたびに初期化されます。ここでの質問は、実際に必要なときにサービスの初期化を延期して、リソースを節約できるようにする方法です。ここで私はLazyを使うべきですか?あるいは、コントローラの代わりにこのサービスをメソッドに注入する必要がありますか?mvcコントローラで注入されたサービスの実行を延期する方法

例:

public class SomeController : Controller 
{ 
    private readonly ISomeService _service; 

    public SomeController(ISomeService service) 
    { 
     this._service = service; 
    } 

    // action that completely doesn't need to initialize service 
    public ActionResult Index() 
    { 
     return View(); 
    } 
    // this action needs to initialize 
    public ActionResult Save() 
    { 
     this._service.DoSomething(); 
     return View(); 
    } 
} 
+0

プロパティインジェクションを実装することができるので、(サービスへの)ゲッターが最初に呼び出されたときに注入されます。 – EluciusFTW

+1

パフォーマンステストを実行して、違いがどのようなもので、実際にアプリケーションにとって重要かどうかを確認しましたか? – Steven

+0

なぜ 'Lazy 'への参照が' T 'への参照よりも速く格納されるのでしょうか? – Maarten

答えて

3

わずか数の考えを使用してninjectに追加することができた場合に自動的に動作します!あなたのクラスのコンストラクタ(この場合はコントローラ)should not do anything except store the dependencies。コントローラの解決時に依存関係を解決する必要があります。

任意のDIフレームワークを使用する場合、コンテナは依存関係階層と寿命管理スコープを事前に把握する必要があるため、コンポーネントが要求したときにコンテナが解決されたインスタンスを提供できるようにします。 パフォーマンスの面が不安な場合は、高速のDIコンテナを使用することができます。

注入されたオブジェクトの作成が高価な場合(初期化で多くのロジックを必要としないためシンプルに保つ傾向があります)、オブジェクトのシングルトンまたはリクエストごとのライフタイムスコープを持つことが考えられます(可能であれば)

+0

私はいくつかのさらなる研究を行いました。ほとんどの場合、Lazy を使用することはほとんどありません。私はあなたの答えを受け入れ、ありがとう –

1

はい、ほとんどのまともなIoCコンテナを使用すると、Lazy<T>を注入し、怠惰なオブジェクトが使用されるまでの初期化を延期することができます。通常、これはちょうどあなたが、私はこれがautofacに内蔵されていると信じて、具体的にLazy<T>

にTからのコンストラクタのパラメータの種類を変更し、モジュールにNinject.Extensions.Factory

関連する問題