使用 C# StructureMap.Mvc 时在基本控制器中进行注入的最佳方法是什么?
我可以想到这两种方法,不知道哪个更好。
- 从控制器参数到基本控制器参数(很好的方法,但当有许多控制器具有许多要注入的属性时会变得一团糟)
- 不要使用子控制器并在基本控制器构造函数中使用 ObjectFactory.CreateInstance() 启动所有注入(代码非常少且易于管理,但当控制器注入可用时不被视为良好做法)
提前致谢。
使用 C# StructureMap.Mvc 时在基本控制器中进行注入的最佳方法是什么?
我可以想到这两种方法,不知道哪个更好。
提前致谢。
我认为麻烦的方法很好,您可以将两者结合使用。当然要视情况而定。
A. 我相信如果您的子控制器需要注入依赖项,请使用构造函数注入。这样,您的 Controller 的构造函数 API 是显式的,它应该说明已注入 Controller 的内容。易于阅读,易于发现。如果你试图在工厂中隐藏你的 DI 类型,你就会失去这个很好的 API/可发现性。如果您认为依赖项是可选的,请使用属性注入。除非您的所有子控制器都使用它们,否则您实际上并没有将这些传递给基本控制器。如果您认为您重载了 Controller 中的类型,请尝试将这些接口聚合为单个类型。
B、不建议直接在Controller中使用Structure map ObjectFactory。您的控制器应该与任何基础设施 DI 工作无关。您可以使用通用工厂(在基础设施中)来创建使用 ObjectFactory 的类型。如果基本控制器需要您的 DI 类型,您可以使用此工厂来解析这些类型。
这些想法只在需要的时候/在需要的地方注入类型。避免在控制器不使用/不需要时将类型注入控制器。
您可以使用的另一个选项是通过 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);
}
....
}
结构图 3.1+:
public class BaseController {
protected IMyExampleServer MyExampleService { get; set; };
public BaseController(IContainer container) {
container.ObjectFactory.BuildUp(this);
}
....
}
使用 StructureMap 3.1 意味着您只需将 的实例IContainer
注入派生控制器,而不是基类所需的每个单独的依赖项。