2012-06-22 2 views
0

Я пытаюсь спроектировать архитектуру для нового проекта MVVM LOB, использующего Caliburn Micro и nHibernate, и теперь я хочу взглянуть на DI и IOC.Является ли MEF локатором сервисов?

Многие примеры для самонастройки Caliburn Micro используют MEF в качестве механизма DI \ IOC.

То, с чем я борюсь, заключается в том, что MEF, по-видимому, достаточно популярен, но идея аннотаций Mef [Imports] пахнет мне, как другой аромат локатора сервисов?

Я пропустил что-то о MEF, из-за чего почти все примеры, которые я видел, не используют его правильно, или я полностью не понял что-то о том, как он используется, когда он выполняет шаги всего локатора службы?

+0

Итак, я только что узнал об атрибуте [ImportingConstructor], который бы включил «правильный» конструктор на основе DI. Но вопрос все еще стоит, есть MEF + [Imports] = Service Locator = Antipattern? –

ответ

1

Я полагаю, что если вы просто new до части, которые имели импорт собственности и попытаться использовать их, то вы можете столкнуться с некоторыми из тех же самых проблем, описанных здесь: Service Locator is an Anti-Pattern

Но на практике вы получите свои детали из контейнер, и если вы используете [Import] без дополнительного имущества allowDefault, тогда деталь потребуется, и контейнер взорвется на вас, если вы попросите часть, выполняющую импорт. Это будет взорваться во время выполнения, да, но, в отличие от запуска сервис-локатора мельницы, довольно просто сделать статический анализ вашего контейнера MEF с использованием тестовой среды. Я написал об этом пару раз here и here.

Это не было проблемой для меня на практике, по нескольким причинам:

  1. я получаю мои детали из контейнера.
  2. I использование тест состава.
  3. Я пишу приложения, а не код рамки.
+0

Эй, Джим, спасибо за ваш вклад. У меня возникает ощущение, что я не буду полностью улавливать MEF как архитектурный инструмент, пока я не получу какую-то кодировку.Чтобы проиллюстрировать мое нынешнее отсутствие понимания, ваши комментарии выше звучат мне так: Чтобы решить проблему IOC \ Decoupling, мы использовали MEF, который решил эти проблемы, но вызвал проблемы с составом настолько сложной, что для их решения была реализована целая структура тестирования. –

+0

Не совсем. Когда вы начинаете, тесты помогают вам узнать, как все работает. После того, как вы знаете, как все работает, это больше связано с ловушкой ошибок с костью. Если это правда, что наличие тестовой структуры подразумевает, что система слишком сложна, то что она говорит о любой системе, которая имеет тесты? Во всяком случае, я говорю, продолжайте и попробуйте, или попробуйте что-нибудь еще. MEF не был первой структурой, которую я пробовал, но это мой любимый. –

+0

Все комментарии, комментарии Jim. Скоро я буду прыгать. –

3

MEF не является локатором сервисов, на его собственном. Он может использоваться для реализации Locator службы (CompositionInitializer в версии Silverlight - это эффективный локатор сервисов, встроенный в MEF), но он также может непосредственно выполнять инъекцию зависимости.

Хотя атрибуты могут «пахнуть» вам, они сами по себе не считают это локатором службы, так как вы можете использовать [ImportingConstructor] для ввода данных во время создания.

Обратите внимание, что атрибуты на самом деле не единственный способ использовать MEF - он также может работать через direct registration или convention based registration (что поддерживается в DropPix и .NET 4.5).

+0

Да, я понимаю, что это не локатор сервисов сам по себе (заголовок, вероятно, не описывает мое намерение должным образом), я просто пытаюсь получить его, и все примеры, которые я нахожу до настоящего времени, в основном используют [ Import] и [Export], и они довольно упрощены. Замените [Import] на Singlton IOC.Resolve() в этих примерах и это локатор сервисов в моей книге. Спасибо за комментарии Рида, вы дали мне еще немного чтения. –

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