Дразнить контейнер IoC? - PullRequest
2 голосов
/ 23 апреля 2011

Имеет ли смысл издеваться над контейнером IoC? Если так, как бы я поступил, используя Moq?

Я создаю приложение Prism 4, используя Unity 2.0 в качестве контейнера IoC. Я внедряю контейнер в классы, которые нуждаются в его сервисах, а не использую Prism ServiceLocator. Для модульного тестирования, если мне не нужны другие сервисы Prism для моего теста, я просто создаю экземпляр контейнера и регистрирую макеты в нем. Я передаю контейнер тестируемому классу, который разрешает макеты.

Все довольно просто, но мне интересно, стоит ли мне издеваться над контейнером? Зачем? Если так, как бы я это сделал, если бы я использовал Moq в качестве моей среды для насмешек? Спасибо за вашу помощь.

Ответы [ 2 ]

10 голосов
/ 23 апреля 2011

Нет, имитировать контейнер DI не имеет смысла, потому что классы приложений вообще не должны ссылаться на контейнер .

Вместо внедрения контейнера в классы, вы должны внедрять только те сервисы, которые им нужны. Это также будет означать, что вы можете протестировать их без ссылки на контейнер DI вообще .

0 голосов
/ 24 апреля 2011

Я согласен с ответом Марка Симанна, как правило, для 99% классов это работает нормально.

Есть некоторые классы фабричного типа (возможно, классы, которые берут Модель и преобразуют ее в ViewModel, где у этих ViewModel есть зависимости), для которых это не работает. В этих случаях я обычно принимаю интерфейс для контейнера, а не его конкретный тип (IUnityContainer, в вашем случае) и как обычно макет.

public class MyWidgetFactory : IMyWidgetFactory
{
     public MyWidgetFactory(IUnityContainer container)
     {
          //...
     }
     public Widget[] GetWidgets()
     {
         //...
     }
}

public class MyWidgetFactoryConsumer
{
     private Widget[] _widgets;
     public MyWidgetFactoryConsumer(IMyWidgetFactory factory)
     {
          _widgets = factory.GetWidgets();
     }
}

Оба вышеперечисленных класса являются тестируемыми, при этом классу фабрики требуется иметь поддельную версию IUnityContainer, а потребителю нужен только сам фабрики.

...