2010-04-13 4 views
2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что между DI и шаблонами локатора обслуживания существует дискуссия. У меня есть вопрос, который призван избежать дебатов. Этот вопрос предназначен для поклонников локатора службы, которые, похоже, думают, что Фаулер «ДИ ... трудно понять ... в целом я предпочитаю избегать этого, если только в этом не нуждаюсь». Для целей моего вопроса я должен избегать DI (причины намеренно не указаны), поэтому я не, пытаясь вызвать споры, не связанные с моим вопросом.Контейнер «ребенок» МОК/Локатор услуг

ВОПРОС: Единственная проблема, с которой я мог бы столкнуться, сохраняя мой контейнер IOC в одноэлементном режиме (помните о моем отказе от ответственности выше), заключается в использовании дочерних контейнеров. Предположительно, детские контейнеры сами по себе не будут одиночными. Сначала я думал, что это создает реальную проблему. Но когда я думал об этом, я начал думать, что именно такое поведение я хочу (детские контейнеры не являются одиночными, и могут быть Disposed() по желанию).

Тогда мои мысли пошли дальше в философское царство. Поскольку я являюсь поклонником локатора службы, мне интересно, насколько важно понимать понятие дочернего контейнера. В небольшом наборе случаев, когда я видел полезность, он должен был удовлетворить DI (которого я вообще избегаю), или проблема была разрешима без обращения в контейнер IOC. Мои мысли были частично вдохновлены IServiceLocator interface, который даже не удосужился перечислить метод GetChildContainer.

Итак, мой вопрос в том, что: если вы являетесь поклонником локатора службы, обнаружили ли вы, что детские контейнеры обычно спорны? В противном случае, когда они были необходимы?

дополнительный кредит: если есть другие философские проблемы с локатором сервисов в одноэлементном режиме (помимо тех, которые ставят сторонники DI), то какие они?

ответ

3

ИМХО:

  • дочерние контейнеры не имеют ничего с сервисными локаторы, то есть они ортогональны. Использование контейнера в качестве локатора сервисов - это просто способ его использования, и он не имеет ничего общего с контейнером, поддерживающим дочерние контейнеры, или нет.
  • Использование детских контейнеров во многом зависит от конструкции контейнера. Например, в то время как Windsor поддерживает их, они редко используются. Autofac OTOH использует их для управления жизненными циклами области/компонентов. И это абсолютно необязательная функция любой реализации локатора контейнера/службы, поэтому IServiceLocator не упоминает об этом. Задача IServiceLocator заключается в предоставлении самого низкого общего знаменателя в локаторе службы.
+0

Ваш ответ - именно то, что я искал, и даже лучше! Вы нашли время, чтобы указать, как часто детские контейнеры используются в различных рамках (* очень * полезный лакомый кусочек) !!! Возможно, я мог бы беспокоить вас еще раз: где Unity вписывается в спектр «детского контейнера»? Являются ли детские контейнеры в Unity более похожими на Windsor (нечасто) или больше похожими на Autofac (часто)? –

+0

Извините, у меня нет большого опыта работы с Unity. –

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