【问题标题】:Constructor Dependency Injection in a ASP.NET MVC ControllerASP.NET MVC 控制器中的构造函数依赖注入
【发布时间】:2009-08-27 00:21:56
【问题描述】:

考虑:

public class HomeController : Controller 
{
    private IDependency dependency;

    public HomeController(IDependency dependency) 
    {
        this.dependency = dependency;
    }
}

而事实上,ASP.NET MVC 中的控制器必须有一个空的默认构造函数,除了为 DI 定义一个空的(我认为没用的)构造函数之外,还有其他方法吗?

【问题讨论】:

    标签: asp.net-mvc dependency-injection


    【解决方案1】:

    如果你想拥有无参数的构造函数,你必须定义一个自定义的控制器工厂。 Phil Haack 有一个很棒的blog post 关于这个主题。

    如果您不想推出自己的控制器工厂,您可以在 codeplex/github 的 ASP.NET MVC Contrib 项目中预先制作它们。

    【讨论】:

      【解决方案2】:

      如果您设置自定义 ControllerFactory 以使用依赖注入框架(如 NinjectAutoFacCastle Windsor 等),则不必使用空构造函数。其中大多数都有 CustomControllerFactory 的代码使用他们可以重复使用的容器。

      问题是,默认的控制器工厂不知道如何将依赖传入。如果你不想使用上面提到的框架,你可以做所谓的穷人依赖注入:

      public class HomeController : Controller
      {
      
          private IDependency iDependency;
      
          public HomeController() : this(new Dependency())
          {
          }
      
          public HomeController(IDependency iDependency)
          {
              this.iDependency = iDependency;
          }
      }
      

      【讨论】:

        【解决方案3】:

        看看 MVCContrib http://mvccontrib.github.com/MvcContrib/。他们有许多 DI 容器的控制器工厂。温莎、结构图等

        【讨论】:

          【解决方案4】:

          您可以通过属性注入您的依赖,例如:Injection by Property 使用Ninject 看起来像这样:

          [Inject]
          public IDependency YourDependency { get; set; }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-18
            • 1970-01-01
            • 2021-09-08
            • 1970-01-01
            • 2012-03-09
            • 2011-02-02
            • 2018-06-17
            相关资源
            最近更新 更多