c# - MVVM 轻量级 SimpleIoc

标签 c# wpf mvvm inversion-of-control mvvm-light

我在我的项目中使用带有 MVVM Light 的 WPF。我有一些关于 SimpleIoC 的小问题容器和 DI。哪个是更好的使用方法,或者告诉我是否不需要在那里使用 DI。

有我的VM构造函数:

public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService, 
                         IUserDataAccessService userDataAccessService, IUserService userService)

和 SimpleIoC 寄存器:
 SimpleIoc.Default.Register<MainViewModel>(() => {
            return new MainViewModel(SimpleIoc.Default.GetInstance<IDialogService>(),
                                     SimpleIoc.Default.GetInstance<IChannelObserverService>(),
                                     SimpleIoc.Default.GetInstance<IInternalBroadcastService>(),
                                     SimpleIoc.Default.GetInstance<IUserDataAccessService>(),
                                     SimpleIoc.Default.GetInstance<IUserService>()); });

请告诉我,我需要在那里使用 DI 吗?
首先,我使用了这样的所有服务:
public MainViewModel(){...}

User user = SimpleIoc.Default.GetInstance<IUserService>().GetCurrentLoggedUser();

或这个:
private IDialogService dialogService;

public MainViewModel()
{
    dialogService = = SimpleIoc.Default.GetInstance<IUserService>();
}

private void MyMethod()
{
    dialogService.ShowQuestionDialog(abc,abc,abc);
}

所以我在创建 View 模型时没有使用 DI。

最佳答案

我建议您使用 DI因为它支持开发松散耦合的代码。通过DI , 你可以 减少紧耦合软件组件之间。此外,它使 单元测试方便的。

我建议有这样的构造函数(正如你在帖子中提到的那样)

public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService, 
                         IUserDataAccessService userDataAccessService, IUserService userService)

但是注册可以简化为
 SimpleIoc.Default.Register<IDialogService, DialogService>();
 //// Other service registrations.

 SimpleIoc.Default.Register<MainViewModel>(); // without injecting the other dependent types. 

使用此 DI 将在创建 MainViewModel 的实例时注入(inject)正确的依赖项。 .

因此,使用上述方法,您不需要在代码中解析实例,因为它已经注入(inject)构造函数中,因此服务代码可以简化为
private void MyMethod()
{
    dialogService.ShowQuestionDialog(abc,abc,abc);
}

关于c# - MVVM 轻量级 SimpleIoc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50384968/

相关文章:

c# - MVVM 模式查询

c# - C# 中的 IIR 低通滤波器在 x86 模式下中断

c# - Entity Framework 不支持 x.ToString()!

c# - Entity Framework 核心 + SQlite。异步请求实际上是同步的

c# - 使用 WPF 图表获取自定义工具提示?

wpf - 在Model View ViewModel中调出新窗口的最佳位置

c# - 从子窗口使用 FolderBrowserDialog 时为什么会出现 System.ComponentModel.Win32Exception?

android - 如何将 Android MVVM 模式与 fragment 一起使用?

c# - 继承自 IEnumerable

validation - 如何使用kendo验证器验证多封电子邮件?