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

时间:2016-07-25 17:34:52

标签: c# asp.net asp.net-core-mvc asp.net-core-1.0 asp.net-boilerplate

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

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:Type   &#39; Presentation.WebUI.Controllers.IDummy&#39;没有   默认构造函数

你能否告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:7)

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

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

参考:Dependency Injection and Controllers

<强> Constructor Injection

  

ASP.NET Core对基于构造函数的依赖项的内置支持   注入扩展到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 Core MVC控制器应该请求它们的依赖项   通过他们的构造函数明确地在某些情况下,个人   控制器动作可能需要服务,它可能没有意义   请求在控制器级别。在这种情况下,您也可以选择   将服务注入操作方法的参数。

<强> Action Injection with FromServices

  

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

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