Asp.net MVC样板依赖注入不起作用

Her*_*ter 6 c# asp.net asp.net-core-mvc asp.net-boilerplate asp.net-core-1.0

我正在玩Asp.Net MVC 6样板项目.我正在尝试为我的一个服务配置依赖注入.看起来内置的IoC容器忽略了我的绑定.

Startup.cs

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

HomeController.cs

public IActionResult Index(IDummy dummy){
    var test = dummy.name;
    return this.View(HomeControllerAction.Index);
}
Run Code Online (Sandbox Code Playgroud)

例外:

ArgumentException:类型'Presentation.WebUI.Controllers.IDummy'没有默认构造函数

你能告诉我我做错了什么吗?

Nko*_*osi 7

该异常是因为框架无法将操作参数绑定到接口.

当框架默认使用构造函数注入时,您正尝试对Action执行注入.

参考:依赖注入和控制器

构造函数注入

ASP.NET Core对基于构造函数的依赖注入的内置支持扩展到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET Core MVC控制器应该通过它们的构造函数显式地请求它们的依赖项.在某些情况下,单个控制器动作可能需要服务,并且在控制器级别请求可能没有意义.在这种情况下,您还可以选择将服务作为参数注入操作方法.

使用FromServices注入动作

有时,您不需要为控制器中的多个操作提供服务.在这种情况下,将服务作为参数注入动作方法可能是有意义的.这是通过使用属性[FromServices]标记参数来完成的,如下所示:

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