Инверсия использования управления из клиентского приложения MVVM - PullRequest
0 голосов
/ 10 марта 2012

Итак, я начинаю новый корпоративный проект и хочу начать с использования контейнера IoC. К настоящему времени проект состоит из клиента MVVM WPF и 4 других сборок (сборка CRM, ReportManager, Security Manager и Repository Manager).

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

Учитывая то, что инициализация сборок происходит каждый раз, когда мне нужно их использовать, и что (как я читал здесь) использование синглтона не очень хорошая идея. Хорошо, если я использую контейнер IoC (я думаю о Виндзоре), и если его, как мне нужно управлять самим экземпляром контейнера? Нужно ли мне создавать экземпляр одноэлементного контейнера или просто инициализировать контейнер в другом классе (MainView), чтобы я мог использовать его зарегистрированные компоненты из другого класса?

1 Ответ

2 голосов
/ 10 марта 2012

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

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

Castle Windsor поддерживает типизированные фабрики , поэтому даже ваши фабрики могут быть автоматически подключены для использования вашего контейнера.

Обновление

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

Если вы используете MVVM, то у вас будут модели и виды представлений, и, по-видимому, каждый из этих элементов UserControls фактически является представлением, которое связано с базовой моделью представления.

Если вы используете первый подход к модели представления (и вам, вероятно, следует), то сервисы, которые требуются модели представления (например, менеджер отчетов, менеджер безопасности и т. Д.), Должны быть внедрены в модель представления через ее конструктор(как абстракция, которая была зарегистрирована для конкретной реализации в контейнере).

В момент, когда вы разрешаете свою модель представления оболочки (в корне композиции), контейнер автоматически внедрит службы, которыеМодель представления оболочки требуется из-за ее поддержки цепочки зависимостей.Эти зависимости оболочки также могут включать модели представлений для каждой из вкладок.

Всякий раз, когда вам нужно создать экземпляр других моделей представлений, модель родительского представления может взять зависимость от фабричного типа, который возвращает экземпляр этого нового представления.модель.Для этих типов фабрики потребуется ссылка на ваш контейнер, но, как я уже упоминал, в случае Castle Windsor (и других контейнеров IoC) предоставляется поддержка для создания фабричных типов, которые неявно разрешаются через контейнер.

...