2016-04-01 1 views
1

Я пытаюсь разработать приложение Prism 6 UWP. Моя текущая проблема заключается в том, что я хочу зарегистрировать все объекты, используемые в приложении с контейнером для инъекций Unity Dependency. Но так много объектов пользовательского интерфейса создаются инфраструктурой (Activator.CreateInstance (type)) и не могут инициировать их создание через зависимую инъекцию conatiner.I будет хорошо, даже если я зарегистрирую созданные объекты с помощью DI conatiner. Я ссылался на образец приложения Github AdventureWorks.Shopper в образцах Призма. Здесь я видел, что представления создаются инфраструктурой, но некоторые другие объекты создаются зависимым впрыском conatiner.Использование контейнера Unity в UWP

Есть ли способ получить все объекты в приложениях и зарегистрировать их с помощью DI conatiner?

Есть ли способ получить все объекты в приложениях и зарегистрировать их с контейнером DI или вызвать все создание через DI conatiner?

+0

Вы хотите зарегистрировать набор объектов через контейнер зависимостей, в который вы можете отразить? Не могли бы вы рассказать о типах в загруженных сборках и загружать их в контейнер DI, причем их метод создания объектов является Activator.CreateInstance? – QiMata

+0

Если я это сделаю, я получаю повторяющиеся объекты. Некоторые объекты пользовательского интерфейса отображаются в виде фреймворка. Фактически пользовательский интерфейс отображается с этим объектом. Но мой контейнер DI имеет другой экземпляр того же класса. –

+0

. Один из способов, мы обнаружили, что мы можем получить доступ к контейнеру как это единствоContainer = (UnityContainer) ((Prism.Unity.Windows.PrismUnityApplication) Application.Current) .Container ;. Объект, созданный каркасом, может быть зарегистрирован с помощью объединения, добавив регистрацию в конструктор api example unityContainer.RegisterInstance (this); –

ответ

2

Как правило, вы не должны пытаться создавать объекты пользовательского интерфейса, созданные контейнером, поскольку, как вы помните, процесс анализа XAML (инфраструктура, как вы его называете) отвечает за это, и нет простого способа войти в цикл, чтобы взять на себя этот процесс строительства.

Это одна из причин, по которой мы добавили ViewModelLocator в Prism - так, чтобы с ViewModel с помощью всех его зависимостей можно подключить метод SetDefaultViewModelFactory, чтобы использовать контейнер для создания всех ваших ViewModels и их зависимостей (и зависимостей зависимостей и т. д.), пока вы используете ViewModelLocator для подключения представления к ViewModel.

Если вы внимательно следите за шаблоном MVVM, то почти никогда не нужно будет создавать объекты интерфейса пользователя через контейнер, потому что они не должны делать какую-либо логику в коде, который будет зависеть от того, контейнер. Но это не значит, что вы будете никогда не это нужно сделать. Таким образом, для тех ситуаций, где вам нужно это делать, вы можете либо добраться до контейнера через Application.Current, как предложил S Vasudev с некоторыми кастингами. Или, если вам нужно сделать это в нескольких местах и ​​не хотите, чтобы весь этот «шум» в коде, то напишите простой вспомогательный объект со статическим свойством, которое вы можете установить в методе OnInitializeAsync класса App, а затем легко доступ в любом месте.

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

0

Один из способов мы обнаружили: - Вы можете получить доступ контейнер единства, как это: -
unityContainer = (UnityContainer) ((Prism.Unity.Windows.PrismUnityApplication) Application.Current) .container;

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

Таким образом, все объекты регистрируются с помощью единства conatiner пример: - unityContainer.RegisterInstance (this);