c# - IoC 容器 - 单例还是传递实例?

标签 c# dependency-injection design-patterns ioc-container

<分区>

Possible Duplicate:
Is it better to create a singleton to access unity container or pass it through the application?

我正在将 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();
  }
}

当然,对于第二种方法,我可能总是通过传递一个单例容器实例来回退到第一种方法。

已编辑:更新的代码示例

最佳答案

两者都不是:这两种方法都隐藏了您的依赖项并使您的类难以使用。相反,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进行更多深入讨论。

关于c# - IoC 容器 - 单例还是传递实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820571/

相关文章:

java - 使用 servlet 处理 GET 时,创建 Guice 注入(inject)的最佳位置是什么?

C# Regex.Replace,冒号作为分隔符,忽略日期时间格式

c# - 在基础设施数据网格中设置列标题

c# - “令人愉快的并行”PLINQ 查询

design-patterns - 通过构造函数或在类方法级别注入(inject)依赖项?

c# - 在 autofac 中可视化依赖树深度

C# 构建失败,文档根级别的 token 文本无效

Java监听器实现

model-view-controller - Symfony2和 View 模型的MVC概念

java - 我可以在工厂中创建 Callable 并通过调度程序执行它们吗?