使用C#StructureMap.Mvc5时,将注入传递给基本控制器的最佳方法是什么?

时间:2014-08-09 19:56:34

标签: c# asp.net-mvc dependency-injection structuremap structuremap3

使用C#StructureMap.Mvc?

时,在基本控制器中进行注入的最佳方法是什么?

我可以想到这两种方式,但不知道哪种方式更好。

  1. 从控制器参数到基本控制器参数 (当有许多控制器需要注入许多属性时,很好的方法会变得一团糟)
  2. 不要使用子控制器并使用基本控制器构造函数中的ObjectFactory.CreateInstance()启动所有注入 (当控制器注入可用时,代码非常少且易于管理但不被视为良好实践)
  3. 提前感谢。

2 个答案:

答案 0 :(得分:0)

我认为麻烦的方法很好,你可以使用两者的混合。当然视情况而定。

一个。我相信如果你的孩子Controller需要注入依赖,那么使用构造函数注入。这样,Controller的构造函数API是显式的,它应该说明注入Controller的内容。易于阅读,易于发现。如果您尝试在工厂中隐藏DI类型,则会失去这个漂亮的API /可发现性。如果您认为依赖项是可选的,请使用属性注入。除非所有子控制器都使用它们,否则您实际上并没有将这些传递给基本控制器。 如果您认为在Controller中重载了类型,请尝试将这些接口聚合为单个类型。

B中。不建议在Controller中直接使用Structure map ObjectFactory。您的控制器应该是任何基础设施DI工作的不可知。您可以使用通用工厂(在基础结构中)来创建使用ObjectFactory的类型。如果基本控制器需要您的DI类型,您可以使用此工厂来解决这些类型。

这些想法,只在他们需要的时间/地点注入类型。避免在不使用/需要时向控制器注入类型。

答案 1 :(得分:0)

您可以使用的另一个选项是通过StructureMap' ObjectFactory.BuildUp()方法进行setter注入。

值得一提的是,在StructureMap 3.1中,ObjectFactory已被弃用,有利于注入IContainer的实例。

示例如下所示:

StructureMap 3.0及以下版本:

public class BaseController {

    protected IMyExampleServer MyExampleService { get; set; };

    public BaseController() {
        ObjectFactory.BuildUp(this);
    }
    ....
}

StructureMap 3.1 +:

public class BaseController {

    protected IMyExampleServer MyExampleService { get; set; };

    public BaseController(IContainer container) {
        container.ObjectFactory.BuildUp(this);
    }
    ....
}

使用StructureMap 3.1意味着您只需要将IContainer的实例注入派生控制器,而不是基类所需的每个依赖项。