【问题标题】:Dependency injection with Unity on wpf MVVM application在 wpf MVVM 应用程序上使用 Unity 进行依赖注入
【发布时间】:2016-08-06 11:34:28
【问题描述】:

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

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

这是我在应用程序中的视图和视图模型。

观看次数:

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

视图模型:

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 之间创建另一个空接口作为示例?

【问题讨论】:

    标签: wpf mvvm dependency-injection


    【解决方案1】:

    让我展示一个示例,并仅针对您的MainWindows 进行解释,至于其余视图和视图模型的操作步骤相同。

    首先,您应该在ViewViewModel 之间创建一个合约。它应该是一些接口,让它调用 IViewMainWindowViewModel (请记住,其他视图和视图模型的名称必须不同,例如 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)*/
    }
    

    那么在你的视图模型中我们应该实现这个接口:

    public MenuViewModel:IViewMainWindowViewModel
    {}
    

    视图应该注入这个接口MainWindows.xaml.cs:

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

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

    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
    }
    

    【讨论】:

    • 嘿。你在写之前看过我的更新吗?我不确定我是否遵循 IViewMainWindowViewModel?
    • @Mikkel ,你忘了注册视图和他的界面
    • 你能试着再读一遍第 1 步到第 4 步吗?解释一下这是对还是错。在 MenuViewModel 中,我无法使用 DataContext 并在触发 Booking 命令时对其进行设置。
    • @Mikkel 伙计,按照我展示的方式进行操作。您的界面“IMenyViewModel”不应该有任何方法或命令。它只是 View 和 ViewModels 之间的合同,有助于决定 Unity 容器应该注入什么(适当的 viewModel 到必要的 View)
    • 好的,我会试一试..只是没有得到命名..我会尽快更新!
    猜你喜欢
    • 2014-10-11
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多