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'没有默认构造函数
你能告诉我我做错了什么吗?
该异常是因为框架无法将操作参数绑定到接口.
当框架默认使用构造函数注入时,您正尝试对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]标记参数来完成的,如下所示:
public IActionResult Index([FromServices] IDummy dummy) {
var test = dummy.name;
return this.View(HomeControllerAction.Index);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |