Как получить экземпляр единого контейнера? - PullRequest
2 голосов
/ 30 января 2012

Я разработал приложение 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.

1 Ответ

5 голосов
/ 31 января 2012

В приведенном выше коде реализован шаблон ServiceLocator .Никогда не следует вызывать контейнер напрямую.

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

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

И это должно быть.Вы никогда не должны вызывать свой контейнер снова.Если класс зависит от какого-либо другого компонента: внедрите этот компонент, используя инъекция конструктора .Если этот класс должен создать другие объекты: введите фабрику.В Unity есть замечательная функция, называемая автоматические фабрики


Обновление

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

...