Я работаю над приложением WPF, использующим архитектуру MVC и контейнер IOC.В настоящее время я борюсь с проблемой дизайна, касающейся объема и срока службы определенных компонентов, предоставляемых контейнером.Вот ситуация.
Я обобщу, сказав несколько неверно, что контейнеры IOC поддерживают два жизненных цикла компонентов: одноэлементный и переходный.Но то, что нам нужно, это золотая середина для определенных наборов компонентов.
Рассмотрим представление, которое отображает список записей в сетке.Когда пользователь нажимает на запись, открывается новое представление для отображения сведений о записи и разрешения редактирования.У пользователя может быть открыто много таких представлений, каждый из которых отображает свою запись.Каждый вид получает свою модель и контроллер.
В контексте заданного набора модель-представление-контроллер существуют некоторые компоненты, такие как диалоговые окна, которые являются как временными, так и ленивыми.То есть мы хотим новый экземпляр каждый раз, когда нам нужно отобразить его, и, поскольку большинство из этих переходных процессов нужны только в том случае, если пользователь предпринимает определенные действия, мы изначально вводим только фабричный делегат.Затем делегат вызывается по мере необходимости для выполнения фактического разрешения зависимости.
Помимо модели, представления и контроллера, существует множество других компонентов, для которых нам нужен один экземпляр на каждый набор mvc.Например, мы реализуем шаблон диалога NHibernate, который требует, чтобы сеанс открывался при открытии представления и оставался открытым до его закрытия.Точно так же каждому набору необходим свой общий брокер событий и, возможно, несколько «других вещей».Если бы все эти зависимости были разрешены в момент создания представления, это не было бы проблемой.Мы могли бы объявить все из них как временные и покончить с этим.
Однако некоторые из этих лениво разрешенных зависимостей сами имеют зависимости от модели, контроллера или «других вещей».Таким образом, проблема заключается в том, что при разрешении отложенной зависимости контейнеру за делегатом необходимо внедрить правильный экземпляр каждой зависимости.Это, конечно, подразумевает, что сам делегат каким-то образом связан с набором mvc, но это не должно быть проблемой, если большая проблема может быть решена.
Теперь выше я сказал, что я упрощаю список поддерживаемых жизней.циклы.Большинство контейнеров поддерживают некоторые промежуточные жизненные циклы, такие как на поток или предварительный запрос, которые позволяют определить объем, который концептуально аналогичен тому, что мы ищем.Однако они не применяются в сценарии интерактивного интерфейса пользователя.Это не тот случай, когда каждое представление находится в своем собственном потоке или в каком-то другом удобном контексте, который обеспечивает основу для определения области видимости.
Таким образом, мой вопрос заключается в том, каков наилучший способ реализации жизненного цикла компонента для представления (или для любого произвольного контекста) с использованием контейнера IOC.Наш нынешний контейнер - Unity, но мы достаточно хорошо абстрагировались, чтобы переключаться без особых сложностей.Так что, если это легче реализовать в другом контейнере или внедрить из коробки, мы могли бы рассмотреть возможность переключения.