MVVM Light SimpleIoc

时间:2018-05-17 06:43:39

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

我在我的项目中使用WPF和MVVM Light。关于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-Models时,我没有使用DI。

1 个答案:

答案 0 :(得分:1)

我建议您使用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的实例时注入正确的依赖项。

因此,使用上述方法,您不需要在代码中解析实例,因为它已经在构造函数中注入,因此服务代码可以简化为

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