2014-01-30 6 views
0

Я использую Prism + Unity в приложении wpf с использованием MVVM. Я начинаю с Призма и Единства.Injection Constructor Unity

Я хочу иметь возможность закрыть текущий вид. В различных решениях и статьях, которые я прочитал, говорится, что лучший способ сделать это - из модели представления. Но для модели просмотра требуется объект менеджера региона, чтобы закрыть представление. Итак, давайте создадим инъекцию конструктора. Никогда не пробовал это раньше, но есть много вопросов о SO, которые справляются с этим.

Позвольте мне начать с объяснения того, как вещи связаны друг с другом. У меня есть класс bootstrapper, который обрабатывает регистрацию типов и экземпляров.

Вот как зарегистрирован мой вид и вид модели:

container.RegisterType<IViewModel, ViewAccountsViewModel>(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager)))); 
container.RegisterType<ViewAccountsView>(); 

Вот модуль для представления счетов вид:

public class ViewAccountsModule : IModule 
{ 
    private readonly IRegionManager regionManager; 
    private readonly IUnityContainer container; 

    public ViewAccountsModule(IUnityContainer container, IRegionManager regionManager) 
    { 
     this.container = container; 
     this.regionManager = regionManager; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    public void Initialize() 
    { 
     regionManager.RegisterViewWithRegion("MainRegion",() => this.container.Resolve<ViewAccountsView>()); 
    } 
} 

В моей ViewAccountsView.xaml, я устанавливаю данные контекст так:

<Grid.DataContext> 
    <vm:ViewAccountsViewModel/> 
</Grid.DataContext> 

И мой вид модели конструктора:

[InjectionConstructor] 
public ViewAccountsViewModel(IRegionManager regionManager) 
{ 
    if (regionManager == null) throw new ArgumentNullException("regionManager"); 

    this.regionManager = regionManager; 
} 

При компиляции решения появляется сообщение о том, что тип «ViewAccountsViewModel» не содержит доступных конструкторов. Если я добавлю конструктор по умолчанию в мою модель представления, отобразится представление, но я не могу удалить представление из региона. Я получаю аргумент null исключение.

Вот код для удаления вида:

regionManager.Regions["MainRegion"].Remove(regionManager.Regions["MainRegion"].GetView("ViewAccountsView")); 

Я еще очень начинающий с IoC и DI. Есть что-то, что я пропустил?

+0

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

+0

Я хотел добавить, что если я перейду на 'container.RegisterType ();' отобразится мое представление, но я не могу удалить представление. Мой перегруженный конструктор не вызван. –

ответ

4

Unity будет обрабатывать все зависимости, которые он знает для вас. По умолчанию Unity вызовет конструктор с наибольшим количеством параметров. Вы обычно используете InjectionConstructor, чтобы либо сообщать Unity, чтобы выбрать другой конструктор, когда он создает для вас объекты, или если вы хотите передать ему пользовательские параметры.

Регистрация:

container.RegisterType<IViewModel, ViewAccountsViewModel>(); 
// If you plan to have multiple IViewModels, it will need to have a name 
// container.RegisterType<IViewModel, ViewAccountsViewModel>("ViewAccountsViewModelName"); 
container.RegisterType<ViewAccountsView>(); 

ViewModel:

// If you decide later you need other dependencies like IUnityContainer, you can just set 
// it in your constructor and Unity will give it to you automagically through the power 
// of Dependency Injection 
// public ViewAccountsViewModel(IRegionManager regionManager, IUnityContainer unityContainer) 
public ViewAccountsViewModel(IRegionManager regionManager) 
{ 
    this.regionManager = regionManager; 
} 

View Code Behind:

// If you have a named IViewModel 
// public ViewAccountsView([Dependency("ViewAccountsViewModelName")]IViewModel viewModel) 
public ViewAccountsView(IViewModel viewModel) 
{ 
    this.InitializeComponent(); 
    this.DataContext = viewModel; 
} 
+0

Большое спасибо за ответ. Это сработало для меня. – Snesh

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