IoC容器的好处

我试图打开我的想法IoC的原则,我碰到了文章:马丁福勒IoC

他提供了一些使用PicoContainer的例子:

private MutablePicoContainer configureContainer() {
        MutablePicoContainer pico = new DefaultPicoContainer();
        Parameter[] finderParams =  {new ConstantParameter("movies1.txt")};
        pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
        pico.registerComponentImplementation(MovieLister.class);
        return pico;
    }

然后使用示例:

public void testWithPico() {
        MutablePicoContainer pico = configureContainer();
        MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
        Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
        assertEquals("Once Upon a Time in the West", movies[0].getTitle());
    }

首先想到的是:为什么要使用像PicoContainer这样复杂的东西来配置对象的创建 - 实际上应用依赖注入 - (我是.NET开发人员,所以在.NET中它可能需要使用Reflection ,这是耗时的),当我们可以用快速的操作符实现在(例如) 工厂生成器中相同的封装对象创建。

另一件事: configureContainer()仍然被编译,确切的类型是在编译时指定的。 那么为什么不使用工厂,并在配置文件中决定使用哪个工厂?

由于我对这种方法不熟悉,我想我缺少IoC容器的好处。


我只是在这里更新了与这个问题有关的答案。

在.Net中,我会看看Unity Framework(来自MSFT)的文档。 我还对编写实施注册的想法持怀疑态度,但随着时间的推移,我克服了这一点。 主要是因为你确实可以使用基于文件的配置,你可以注册多个实现(并且标记每个实现以便它们可以被调用),并且通常你在生产中不使用多个实现。

最大的好处是自动装配 - 您可以找到您的依赖关系。 一组复杂的类的链式自动装配非常漂亮,如果没有其他因为你可以轻松地注册一个10类中的一个类的Mock实例而不触及实现代码。 这导致了以引导容器为代价的大量可测试性。 现在对我来说,这是桌面赌注,甚至不值得讨论。 想象一下,如果Type1依赖于2,3和4,4依赖于5和6,6依赖于7.如果我想测试系统如何对6中的错误做出反应,我该怎么做? 我需要做的就是Mock(使用像Moq这样的酷酷框架)Type6,注册模拟,但使用其他类的实际实现。

[Fact]
public void TestType6BlowingUp()
{
  IocContainer container = new IocContainer();
  container.RegisterType(Type1, Type1Impl);
  container.RegisterType(Type2, Type2Impl);
  container.RegisterType(Type3, Type3Impl);
  container.RegisterType(Type4, Type4Impl);
  container.RegisterType(Type5, Type5Impl);
  container.RegisterType(Type6, Type6Mock);
  container.RegisterType(Type7, Type7Impl);

  Type1 type1 = container.Resolve<Type1>();
  Type1Response response = type1.DoSomethingThatCallsType6Downstream();
  //Should get errorcode 500
  Assert.True("Expected ErrorCode 500", response.ErrorCode == 500);
}
链接地址: http://www.djcxy.com/p/77765.html

上一篇: Benefits of IoC Containers

下一篇: Benefits from factory method pattern