6

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

启动.cs

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

家庭控制器.cs

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

例外:

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

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

4

1 回答 1

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

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

使用 FromServices 进行动作注入

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

public IActionResult Index([FromServices] IDummy dummy) {
    var test = dummy.name;
    return this.View(HomeControllerAction.Index);
}
于 2016-07-25T17:46:56.310 回答