2011-01-27 31 views
8

可能重复:
Is it better to create a singleton to access unity container or pass it through the application?IoC容器 - 单例还是绕过实例?

我介绍IoC容器到系统中。自然的问题是,它应该是一个单例还是一个传递给一个类的实例?我倾向于把它作为一个单例实例,因为:

  1. 不需要像构造函数那样混乱类定义,附加属性。
  2. 更清晰 - 每个应用程序一个实例,一个初始化路由。
  3. 如果需要,可以使用覆盖进行默认映射(如单元测试)。

下面是它的外观:

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(); 
    } 
} 

当然用第二种方法我可以一直通过传递一个单例容器实例来回退到第一个。

编辑:更新的代码示例

+1

Duplicate:http://stackoverflow.com/questions/2386487/is-it-better-to-create-a-singleton-to-access-unity-container-or-pass-it-through-t –

+0

Voted我自己关闭作为dup。除了唯一的答案是将IoC用法注意力分散到DI,这不是我正在问的问题。请投票结束。 – Schultz9999

回答

31

无论是:这两个方法的隐藏你的依赖,使你的类很难使用。相反,Foo应要求在其构造方法的IBar

class Foo { 
    private bar; 
    public Foo(IBar bar) { this.bar = bar; } 
    private void DoBarStuff() { 
     this.bar.DoStuff(); 
    } 
} 

应该知道你的容器中的唯一的东西是你的应用程序入口点。

请参阅Dependency Injection Myth: Reference PassingService Locator is an Anti-Pattern进一步深入讨论。

+0

繁荣。唯一正确的答案。 – jason

+0

不错的相关链接 – BrokenGlass

+1

如果Foo中的某些特定条件需要创建您的Bar,那么在创建Foo之前​​您无法实例化您的Bar,而是需要将Type传递给它。 –