Я пытаюсь открыть свой разум для причудливого 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, для настройки создания объекта - и фактически применять Dependency Injection - (я - разработчик .NET, поэтому в .NET это, вероятно, потребует используя Reflection (что занимает много времени), когда мы можем достичь той же инкапсуляции создания объекта в (например) Фабриках или Builder , с быстрым новый оператор.
Еще одна вещь: configureContainer () все еще компилируется, точные типы указываются во время компиляции. Так почему бы не использовать фабрики и решить в конфигурационном файле, какую фабрику использовать?
Поскольку я новичок в этом подходе, думаю, что-то упускаю из-за преимуществ Контейнеров IoC.