gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:26:50 25 4
gpt4 key购买 nike

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

查看了另一个 SO 帖子 --> Wpf Unity但似乎还不太明白。我以前使用过 Unity,但只是在 MVC 应用程序中,所以我知道如何将它注入(inject)构造函数。

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

观看次数:

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

View 模型:

MenuViewModel (MainWindow uses this viewModel)
BookingViewModel
ContactViewModel
ReservationsViewModel

我的 ViewModel 都实现了接口(interface),比如 IMenuViewModel, View 也应该有接口(interface)吗?

我猜既然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接口(interface),该接口(interface)为空。

public interface IViewMainWindowViewModel
{

}

4: 在MainWindow中引用这个接口(interface)

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;
}

应用类现在看起来像这样:

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 中,它有两个命令可以打开两个 View ,然后我是否需要在 MenuViewModel 的构造函数中注入(inject)这些 View ,或者您可以在 MenuViewModel 和 BookingView 之间创建另一个空接口(interface)作为示例吗?

最佳答案

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

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

然后在您的 View 模型中我们应该实现这个接口(interface):

public MenuViewModel:IViewMainWindowViewModel
{}

View 应该注入(inject)这个接口(interface)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
}

关于wpf - 在 wpf MVVM 应用程序上使用 Unity 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com