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

該異常是因爲框架無法將操作參數綁定到接口。

當您嘗試在Action中執行注入時,框架默認使用構造函數注入。

參考:Dependency Injection and Controllers

Constructor Injection

ASP.NET核心內置的基於構造函數的依賴注入 延伸到MVC控制器的支持。通過簡單地向您的控制器添加服務類型 作爲構造函數參數,ASP.NET Core將 嘗試使用其內置的服務容器來解析該類型。

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); 
}