【发布时间】:2012-09-05 15:09:42
【问题描述】:
我有一个项目,其中 Ninject 用作 IoC 容器。我担心的是很多类都有这样的构造函数:
[Inject]
public HomeController(
UserManager userManager, RoleManager roleManager, BlahblahManager blahblahManager) {
_userManager = userManager;
_roleManager = roleManager;
_blahblahManager = blahblahManager;
}
如果我不想一次拥有这些类的所有实例怎么办?
当所有这些类都由Lazy<T> 包装并传递给构造函数时,这并不是我所需要的。 T 实例尚未创建,但 Lazy<T> 实例已存储在内存中。
我的同事建议我使用工厂模式来控制所有实例化,但我不确定 IoC 是否有这么大的设计错误。
对于这种情况是否有解决方法,或者 IoC 的设计真的有这么大的缺陷?也许我应该使用另一个 IoC 容器?
有什么建议吗?
【问题讨论】:
-
在控制器工作期间我可能需要 UserManager,但不需要 RoleManager,反之亦然。如果您谈论的是 Lazy
实例,那么将它们放在内存中并不是什么大问题,但这是唯一的方法吗? -
为什么
UserManager和RoleManager很重要?无论如何,您的构造函数不应该做繁重的工作。 -
它们存储在内存中,如果它们真的很复杂,可能会导致性能问题。此外,该示例仅包含三个注入的类,但如果还有更多...
-
@DanielHilgarth - 是的,虽然这意味着您不需要创建明确的工厂类型。
-
每个容器都允许您注入
Func<T>或Lazy<T>。只需在容器中手动注册Func<T>或Lazy<T>。
标签: c# .net design-patterns inversion-of-control ninject