我正在玩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;没有 默认构造函数
你能否告诉我,我做错了什么?
答案 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);
}