【问题标题】:IoC container - singleton or passed around instance? [duplicate]IoC 容器 - 单例还是传递实例? [复制]
【发布时间】:2011-01-27 18:57:31
【问题描述】:

可能重复:
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();
  }
}

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

已编辑:更新的代码示例

【问题讨论】:

  • 投票决定以 dup 的身份关闭。此外,唯一的答案是将注意力从 IoC 的使用转移到 DI,这不是我要问的问题。请投票关闭。

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


【解决方案1】:

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

【讨论】:

  • 轰隆隆。唯一正确的答案。
  • 如果创建 Bar 需要 Foo 中的某些特定条件,这样您就无法在创建 Foo 之前实例化 Bar,而是需要将 Type 传递给它。
  • @Sparkie - 在这些情况下,您通常需要 IBarFactory 并推迟创建,直到您有足够的信息来创建 Bar 实例。
  • @Jeff:我不想处理传递的东西。这就是我想要 IoC 容器的原因。无论存在多少依赖项,它都会为我连接类。这就是它的目的,我认为你没有理解它。
  • @to all:很抱歉,但这对我来说是不可接受的答案,因为拥有 IFoo、IBar、IBaz 和另外 10 个具有相互依赖的相应实现的接口,设置所有这些很乏味并且容易出错。这就是 IoC 容器的用途。欢迎 Jeff 手动完成,但我更愿意依赖 IoC 容器而不是开发人员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2013-01-12
相关资源
最近更新 更多