【发布时间】:2010-12-13 19:01:24
【问题描述】:
这就是我想要的 DI 容器:
public class Class
{
public Class(IDependency dependency, string data) { }
}
var obj = di.Resolve<Class>(() => new Class(null, "test"));
兴趣点:
- 可以在构造函数中解析依赖和数据。
- 可以使用类型安全的语法来传递构造函数参数(确切的语法可能会有所不同)。是的,我可以通过从 (Expression.Body as NewExpression) 获取构造函数参数来自己完成 - 但我需要一种方法来检测容器中注册了哪些参数。
另一个主要要求是我希望我的组件被自动拾取,即我不想注册 Class - 我希望 IoC 拾取它,因为它知道如何解决 IDependency。
此外,属性注入有时也很有用,但这是可选的。
问题实际上是关于功能的组合 - 拥有所有功能 - 类型安全、参数、自动提取...检查一个功能很容易,但它们的组合不容易验证,除非熟悉特定容器并了解其功能。因此问题。
【问题讨论】:
-
我认为没有任何容器支持这种语法。但是许多(几乎所有)容器都支持显式容器参数,并且可能具有更简洁的语法。
-
“可能”不是答案...据我所知,我可以传递 object[] 参数数组,但它显然不是类型安全的...我可以更改参数顺序并获胜直到运行时才知道这一点。
-
更清洁的意思是您不需要像上面那样在代码中显式使用 ctor。而不是你写的,为什么不:
var obj = new Class(di.Resolve<IDependency>(), "test");? -
因为 Class 是我在 MVC 中的 Controller 构造函数的参数,而 Controller 是由 DI 容器创建的。
-
嗯,你说得对,这与构造函数无关(我不在那里传递参数)。好吧,还有另一个原因 - 如果我有 3 个参数,我将不得不做 3 次 Resolve,这是一些额外的代码。