sti*_*k81 35 .net ioc-container unity-container resolve
给定一个带有几个构造函数的类 - 如何告诉Resolve使用哪个构造函数?
请考虑以下示例类:
public class Foo
{
public Foo() { }
public Foo(IBar bar)
{
Bar = bar;
}
public Foo(string name, IBar bar)
{
Bar = bar;
Name = name;
}
public IBar Bar { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我想使用Resolve创建一个Foo类型的对象,Resolve将如何知道要使用哪个构造函数?我怎么能告诉它使用正确的呢?假设我有一个注册了IBar的容器 - 它会理解它应该支持构建者采用IBar吗?如果我也指定了一个字符串 - 它会使用(string, IBar)
构造函数吗?
Foo foo = unityContainer.Resolve<Foo>();
Run Code Online (Sandbox Code Playgroud)
请忽略这样一个事实:如果类只有一个构造函数可能会更容易...
Mar*_*ann 33
注册类型时,可以指定要使用的构造函数,如下所示:
container.RegisterType<Foo>(
new InjectionConstructor(
new ResolvedParameter<IBar>()));
Run Code Online (Sandbox Code Playgroud)
上面的代码来自内存,但这是一般原则.在这种情况下,我选择了采用IBar类型的单个参数的构造函数.
请忽略这样一个事实:如果类只有一个构造函数可能会更容易...
我不能忽视这一点.在构造函数注入方面,模糊性是一种设计气味.你基本上是在说:我真的不知道我是否关心这种依赖性.
当然,Unity可能会为您解决这个问题,但是您将依赖于特定的容器行为,而不是正确设计您的API.其他容器可能有不同的行为,因此如果您选择从Unity迁移到更好的容器,可能会出现细微的错误.
以与DI兼容但以容器无关的方式编写代码要安全得多.
归档时间: |
|
查看次数: |
15363 次 |
最近记录: |