【发布时间】:2011-09-06 22:42:03
【问题描述】:
我正试图为花哨的 IoC 原则敞开心扉,我偶然发现了这篇文章: Martin fowler on 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,这很耗时),当我们可以在(例如)Factories 或 Builder 中实现对象创建的相同封装时,使用快速 new 运算符。
另一件事:configureContainer() 仍在编译,确切的类型在编译时指定。那么为什么不使用工厂,并在配置文件中决定使用哪个工厂呢?
由于我是这种方法的新手,我想在 IoC 容器的好处方面我缺少一些东西。
【问题讨论】:
标签: design-patterns dependency-injection inversion-of-control ioc-container