gpt4 book ai didi

c# - 使用 MVVM 和子窗口进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 10:13:32 25 4
gpt4 key购买 nike

我正在使用 MVVM Light,目前正在使用软件包附带的 SimpleIoC。我对依赖注入(inject)有点困惑。我想在 View 模型中使用一堆服务,但是大多数窗口都是列表编辑范例,即一个屏幕列出所有类型 Person ,然后您可以添加或编辑 Person 通过新屏幕。

当我在添加和编辑记录的代码后面的代码中执行所有代码时,如下所示:

查看

private void btnEdit_Click(object sender, RoutedEventArgs e)
{
_viewModel.Edit();
}

private void btnAdd_Click(object sender, RoutedEventArgs e)
{
_viewModel.Add();
}

查看模型

public void Add()
{
var f = new TypeDetails();
f.Show();
}
public void Edit()
{
if (SelectedItem == null)
return;
var f = new TypeDetails(SelectedItem.Id);
f.Show();
}

TypeDetails的构造函数如下:

public TypeDetails(int id = 0)
{
InitializeComponent();
_viewModel = new TypeDetailsViewModel(id);
DataContext = _viewModel;
}

使用 MVVM Light 实现此类功能的最佳方式是什么?我一直在为列表屏幕使用 ViewModelLocator 类,但是我看不到使用 SimpleIoC 执行此操作的方法。到目前为止,我的方法是保持构造函数相同,这可以正常工作,直到我需要将依赖项注入(inject)到 TypeDetailsViewModel 中(例如服务)。对于服务,TypeDetailsViewModel 的构造函数将是:

public TypeDetailsViewModel(ISomeService someService, int id = 0)
{
...
}

但这意味着在我的 View 构造函数中,我必须一次构建这些依赖项并手动注入(inject)它们......

public TypeDetails(int id = 0)
{
InitializeComponent();
_viewModel = new TypeDetailsViewModel(SimpleIoC.Current.GetInstance<ISomeService>(),id);
DataContext = _viewModel;
}

有更好的方法吗?

最佳答案

  • 首先,我将研究“RelayCommand”类,它是 MVVM Light 的一部分。它将消除后面代码中对事件的需要。从那开始。

  • 您应该始终青睐“构造函数注入(inject)”而不是 ServiceLocator(例如:SimpleIoC.Current.GetInstance())

  • 您的 ViewModel 构造函数应该只注入(inject)服务,而不是像“int”这样的基本类型。在您的示例中,“int id”应该是方法的参数,而不是注入(inject)。

例如:相反,您的 TypeDetailsViewModel 应该看起来更像:

public TypeDetailsViewModel(ISomeService someService)
{
TypeDetail GetDetailsCommand(int id)
{
...
}
}

关于c# - 使用 MVVM 和子窗口进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18275984/

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