6

私はAsp.Net MVC 6 boilerplateプロジェクトで遊んでいます。私は私のサービスの一つに依存性注入を設定しようとしています。組み込みのIoCコンテナが自分のバインディングを無視しているようです。Asp.net MVCのボイラープレート依存性注入が動作しない

Startup.cs

public void ConfigureServices(IServiceCollection services){ 
    /*boilerplate's default bindings*/ 
    services.AddTransient<IDummy, Dummy>(p => new Dummy() 
     { 
      name = "from injection" 
     }); 
} 

HomeController.cs

public IActionResult Index(IDummy dummy){ 
    var test = dummy.name; 
    return this.View(HomeControllerAction.Index); 
} 

例外:

ArgumentExceptionが:タイプ 'Presentation.WebUI.Controllers.IDummy' は を持っていませんデフォルトコンストラクタ

私は何が間違っているのか教えてください。

答えて

7

例外は、フレームワークがアクション引数をインターフェイスにバインドできないためです。

フレームワークがデフォルトでコンストラクタインジェクションを使用しているときに、アクションに対してインジェクションを実行しようとしています。

参考:

Dependency Injection and Controllers

Constructor Injection ASP.NETコア内蔵の 注入は、MVCコントローラに拡張し、コンストラクタベースの依存関係のためのサポート。コントローラーにコンストラクターパラメーターとしてサービスタイプ を追加するだけで、ASP.NETコアは の組み込みサービスコンテナを使用してそのタイプを解決しようとします。

public class HomeController : Controller { 
    IDummy dummy; 
    public HomeController(IDummy dummy) { 
     this.dummy = dummy 
    } 

    public IActionResult Index(){ 
     var test = dummy.name; 
     return this.View(HomeControllerAction.Index); 
    } 
} 

ASP.NET MVCのコア・コントローラは、そのコンストラクタ経由で明示的にそれらの依存関係 を要求すべきです。場合によっては、個々のコントローラの動作がサービスを必要とする場合があり、コントローラレベルで 要求が意味をなさない場合があります。この場合、アクションメソッドのパラメータとして サービスを挿入することもできます。

Action Injection with FromServices

ときには あなたのコントローラ内の複数のアクションのためのサービスを必要としません。この場合、アクションメソッドにパラメータとして サービスを注入することは意味があります。ここに示すように、これは、属性[FromServices]で パラメータをマークすることによって行われます。

public IActionResult Index([FromServices] IDummy dummy) { 
    var test = dummy.name; 
    return this.View(HomeControllerAction.Index); 
}