使用C#StructureMap.Mvc?
时,在基本控制器中进行注入的最佳方法是什么?我可以想到这两种方式,但不知道哪种方式更好。
提前感谢。
答案 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
的实例注入派生控制器,而不是基类所需的每个依赖项。