【问题标题】:Asp.net MVC boilerplate dependency injection not workingAsp.net MVC 样板依赖注入不起作用
【发布时间】:2016-07-25 17:34:51
【问题描述】:

我正在玩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:类型 'Presentation.WebUI.Controllers.IDummy' 没有 默认构造函数

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

【问题讨论】:

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


    【解决方案1】:

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

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

    参考:Dependency Injection and Controllers

    Constructor Injection

    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 控制器应该请求它们的依赖项 显式地通过它们的构造函数。在某些情况下,个人 控制器操作可能需要服务,并且可能没有意义 控制器级别的请求。在这种情况下,您还可以选择 将服务作为参数注入到操作方法中。

    Action Injection with FromServices

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多