【发布时间】:2011-01-27 18:57:31
【问题描述】:
可能重复:
Is it better to create a singleton to access unity container or pass it through the application?
我正在将 IoC 容器引入系统。自然的问题是,它应该是单例还是传递给类以使用的实例?我倾向于将其作为单例实例,因为:
- 无需像构造函数、附加属性等混乱的类定义。
- 更清晰 - 每个应用程序一个实例,一个初始化路由。
- 能够在必要时使用覆盖的默认映射(例如用于单元测试)。
这是它的外观:
class Main
{
public static void main(params string[] args)
{
IoCContaner.Intance.Add<IBar>();
IoCContaner.Intance.Add<IBaz>();
IoCContaner.Intance.Add<IQux>();
var foo = new Foo();
Foo.DoBarStuff();
}
}
class Bar : IBar
{
public Bar(IBaz, IQuz) {}
public void DoBazStuff() { _baz.DoStuff(); }
}
class Foo
{
public void DoBarStuff()
{
var bar = IoCContaner.Intance.Resolve<IBar>();
bar.DoBazStuff();
}
}
有什么我遗漏的东西,而实际上我应该有类似的东西:
class Foo
{
IoCContainer _c;
public Foo(IoCContainer c) { _c = c; }
...
private void DoBarStuff()
{
var bar = _c.Resolve<IBar>();
bar.DoBazStuff();
}
}
当然,对于第二种方法,我可能总是通过传递一个单例容器实例来回退到第一种方法。
已编辑:更新的代码示例
【问题讨论】:
-
投票决定以 dup 的身份关闭。此外,唯一的答案是将注意力从 IoC 的使用转移到 DI,这不是我要问的问题。请投票关闭。
标签: c# dependency-injection design-patterns ioc-container