2012-04-05 5 views
0

В блоге Kozmic (от 2009 г.) он рекомендует Generic Factory извлекать объекты из контейнера. Ну, для меня это похоже на локатор псевдослужбы. Поэтому я хочу спросить мнение экспертов здесь.Castle Windsor Generic Typed Factory

public interface IGenericFactory 
    { 
     T Create<T>(); 
    } 

Могу ли я использовать это для извлечения объектов из контейнера Windsor? Есть ли недостатки в этом подходе?

Update:

На самом деле, я хочу, чтобы использовать его, чтобы получить только несколько переходных процессов, что я не хочу, чтобы создать несколько заводов по. Имея один завод для всех таких сценариев.

ответ

1

Я сделал быстрый поиск Google и нашел эту статью, вы, вероятно, со ссылкой на: http://kozmic.pl/2009/12/23/castle-typed-factory-facility-reborn/

Если это так, то Кшиштоф Kozmic это говорит сам:

[...] с буквально никаким усилием вы можете использовать его для того чтобы построить общий локатор обслуживания.

Да, в настоящее время Service Locator is considered to be an anti-pattern.

Однако статья посвящена исключительным случаям. Автор ставит его довольно ясно в первом абзаце:

Общего правила при использовании контейнеров IoC - когда вы ваш контейнер в ваших компонентах (в любом месте за пределы вашего кода самонастройки) вы делаете это неправильно. Как и во всех правилах, есть исключения, но они редки.

+0

@ w0lf - При использовании фабричного подхода Generic мне не нужно ссылаться на контейнер в моем коде. Я зарегистрирую его как типичную фабрику и бум. Внесите завод и получите все, что хотите! (на самом деле, я хочу использовать его, чтобы получить только несколько переходных процессов, которые я не хочу создавать для нескольких заводов).Я хочу убедиться, что это хорошо или плохо? – user1178376

+0

@ user1178376 Проблема с этим подходом заключается в том, что на самом деле это абстрактный сервисный локатор, который может легко скрывать зависимости класса. Чтобы избежать этого и связанных с этим проблем обслуживания, попробуйте использовать простые конструкторские инъекции и специализированные фабрики. – GolfWolf

+1

Также обратите внимание на комментарий Николаса Блумхардта. Он описывает это довольно четко: «он мог бы попытаться создать буквально все, и это усложнит работу и протестирует». – Steven

1

Вместо этого необходимо учитывать следующее:

public interface IGenericFactory<out T> 
{ 
    T Create(); 
} 

Интерфейс должен только быть создан один раз, но он должен быть введен для каждого сервиса вам нужно решить. Таким образом, это не общий сервисный локатор (который является антипаттерном, как ранее упоминалось w0lf).

Бонусные баллы:

инъекции Нормальная зависимость требует, чтобы все услуги в вашем графе зависимостей могут быть решены. IGenericFactory<> будет автоматически разрешаться с помощью типичного заводского оборудования. Но его аргумент универсального типа не будет разрешен до выполнения Create().

Если это происходит в краевой кейсе глубоко в вашей программе, и вы забыли зарегистрировать услугу, вы можете не понимать ошибку до производства.

Решение состоит в том, чтобы написать пользовательский резольвер для IGenericFactory<>, который проверяет, имеет ли аргумент generic type обработчик и что он не ждет регистрации каких-либо зависимостей. Информация о настраиваемых преобразователях приведена здесь: http://docs.castleproject.org/Windsor.Resolvers.ash

Смежные вопросы