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