在wpf MVVM应用程序上使用Unity进行依赖注入

时间:2016-04-14 18:27:56

标签: wpf mvvm dependency-injection

我一直在尝试使用Unity在wpf应用程序中设置依赖注入,但似乎无法完全理解应该如何设置视图和视图模型。

已查看另一篇SO帖子 - > Wpf Unity但似乎还不能理解它。我之前使用过Unity,但只是在MVC应用程序中,所以我知道如何在构造函数中注入它。

以下是我在应用程序中的视图和viewModel。

查看:

MainWindow.xaml
BookingView.xaml
ContactDetailsView.xaml
ReservationsView.xaml

的ViewModels:

MenuViewModel (MainWindow uses this viewModel)
BookingViewModel
ContactViewModel
ReservationsViewModel

如果视图也有接口,我的ViewModel都实现了接口,如IMenuViewModel?

我想因为MainWindow是起点,所以应该在这里注册容器吗?

更新

找到了一些东西,但不确定我是否做得对。这是我到目前为止所做的一切!

1:在app.cs中使用启动方法

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        IUnityContainer container = new UnityContainer();

        container.RegisterType<IViewMainWindowViewModel, MainWindow>();
        container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();

        var mainWindow = container.Resolve<MainWindow>(); // Creating Main window
        mainWindow.Show();
    }

}

2:从启动时删除uri。

3:在MainWindow类中创建IViewMainWindowViewModel接口,接口为空。

public interface IViewMainWindowViewModel
{

}

4:在MainWindow中引用此接口

public partial class MainWindow : Window, IViewMainWindowViewModel
{
    public MainWindow(IViewMainWindowViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

5:同样适用于MenuViewModel

public class MenuViewModel : IViewMainWindowViewModel
{
    Code not shown!
}

这甚至不会启动应用程序..

更新2

我的MainWindow课程如下所示:

public interface IViewMainWindowViewModel
{

}

public partial class MainWindow : Window, IViewMainWindowViewModel
{
    public MainWindow(IViewMainWindowViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

App类现在看起来像这样:

protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IViewMainWindowViewModel, MainWindow>();
        container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
        container.Resolve<MainWindow>().Show();
        //Do the same actions for  all views and their viewmodels
    }

运行应用程序时,我在此行上遇到异常

container.Resolve<MainWindow>().Show();

更新3

在我的MenuViewModel中它有两个命令可以打开两个视图,我是否需要在MenuViewModel的构造函数中注入这些视图,或者你可以在MenuViewModel和BookingView之间建立另一个空接口作为一个例子吗?

1 个答案:

答案 0 :(得分:1)

让我举一个只为您的MainWindows解释的示例,其余视图和视图模型的步骤是相同的​​。

首先,您应该在ViewViewModel之间创建合同。它应该是一些接口,让它调用IViewMainWindowViewModel (请记住,其他视图和viewModel的名称必须不同,例如IViewBookingViewViewModel):

public interface IViewMainWindowViewModel
{
       /*This interface should not have any methods or commands. It is just 
       contract between View and ViewModels and helps to decide to Unity 
       container what it should inject(appropriate viewModel to necessary 
       View)*/
}

然后在你的viewmodel中我们应该实现这个接口:

public MenuViewModel:IViewMainWindowViewModel
{}

视图应该注入此接口MainWindows.xaml.cs

public partial class MainWindows : UserControl, IContentAView
{
    public MainWindows(IViewMainWindowViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;            
    }
 }

删除StartupUri并覆盖OnStartup中的方法App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    IUnityContainer container = new UnityContainer();
    container.RegisterType<IViewMainWindowViewModel, MainWindow>();
    container.RegisterType<IViewMainWindowViewModel, MainWindowViewModel >();
    container.Resolve<MainWindow>().Show();
    //Do the same actions for  all views and their viewmodels
}