【问题标题】:Dependency Injection with MVVM and Child WindowsMVVM 和子窗口的依赖注入
【发布时间】:2013-08-16 14:43:09
【问题描述】:

我正在使用 MVVM Light,我目前正在使用该软件包附带的 SimpleIoC。我对依赖注入有点卡住了。我有一堆要在我的视图模型中使用的服务,但是大多数窗口都是列表编辑范例,即一个屏幕列出了所有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 的方法。到目前为止,我的方法是保持构造函数不变,直到我需要将依赖项注入到 TypeDetailsViewModel 中,例如服务。对于服务,TypeDetailsViewModel 的构造函数将是:

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

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# wpf mvvm mvvm-light


    【解决方案1】:
    • 首先,我将研究作为 MVVM Light 一部分的“RelayCommand”类。它将消除您的代码中对事件的需求。从那开始。

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

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

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

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

    【讨论】:

    • 我一直在使用 RelayCommand,它已经消除了这些事件,我只是将它们作为代码过去的示例。我很好奇为详细信息屏幕设置 DataContext 的位置,视图的 Ctor 是否应该调用 SimpleIoCGetInstance&lt;T&gt;()?关于注入,GetDetails 方法将如何以任何方式链接到视图?您能否提供一个扩展的代码示例?我喜欢 MVVM,但我觉得我缺少一些基本的东西。
    • 在我的回答中添加了更多细节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2012-03-15
    • 2010-10-06
    • 1970-01-01
    • 2021-06-03
    • 2020-05-02
    相关资源
    最近更新 更多