2012-01-30 2 views
2

У меня есть приложение Silverlight, и я ввел в него Unity.Как получить экземпляр единственного контейнера?

Проблема у меня есть, я не знаю, как получить экземпляр контейнера.

Я создаю этот вход в инстанс в ApplicationStartup методе на App

_container = new UnityContainer(); 
      _container.RegisterType<IMyAppServiceAgent, MyAppServiceAgent>(new InjectionConstructor(OriginalHandlerId, W2OGuid, ServiceEndpointAddr)); 

и я пишу поглотитель

public IUnityContainer Container 
     { 
      get { return _container; } 
     } 

Все отлично работает, и это, как я использую мой контейнер:

public static void CreateMemberSearch() 
    { 
     if (_memberSearch == null) 
     { 

      _memberSearch = 
       new MemberSearchViewModel((App.Current as App).Container.Resolve<IMyAppServiceAgent>()); 

     } 
    } 

Вышеприведенный пример от ViewModelLocator (от MVVM Light Toolkit).

Мне нужно знать, как реорганизовать мой код, чтобы согласиться с принципами IOC.

ответ

5

Показанный выше код реализует ServiceLocator anti-pattern. Вы никогда не должны вызывать контейнер напрямую.

Контейнер устанавливается в Composition Root. Для приложения Silverlight, которое будет вашим методом ApplicationStartup или специальным загрузочным устройством, например, в Caliburn.Micro.

Этот экземпляр контейнера вызывается ровно один раз, чтобы разрешить ваш основной вид другой модели (в зависимости от того, как вы используете первый или первый подход к viewmodel).

И это должно быть так. Вы никогда не должны звонить в свой контейнер снова. Если класс зависит от какого-либо другого компонента: вставьте этот компонент с помощью constructor injection. Если этому классу необходимо создать другие объекты: введите завод. Unity имеет хорошую особенность под названием automatic factories


Update

Если ViewModelLocator является частью инфраструктуры, и вы никогда не использовать его непосредственно в коде приложения ... возможно. Пожалуйста, посмотрите мой комментарий на вопрос @ MikePost.

+0

спасибо за ваш ответ Себастьян. Итак, если я добавлю IUnityContainer в конструктор ViemModelLocator, это будет приемлемо? – user278618

+0

вопрос для Себастьяна. Я использую container.Resolve () для создания экземпляров моих объектов (например, при ленивой загрузке). Вы говорите, что этого не должно быть сделано? – Anton

+0

Интересно, особенно anti-pattern link. Но как решить проблемы, которые были решены с помощью шаблона-модели-локатора, используя статический шлюз к контейнеру DI? –

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