【问题标题】:MVVM Light SimpleIocMVVM 轻量级 SimpleIoc
【发布时间】:2018-10-27 08:09:05
【问题描述】:

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

有我的虚拟机构造函数:

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

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

【问题讨论】:

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


    【解决方案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);
    }
    

    【讨论】:

    • 感谢您的建议 :) 我不知道我不需要在注册时创建完整的构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多