MVVM 如何注册多个同类型的服务?

发布于 2022-09-05 04:16:34 字数 1830 浏览 41 评论 0

MvvmLight 的示例代码如下:

static ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    var nav = new NavigationService();
    nav.Configure(SecondPageKey, typeof(SecondPage));
    SimpleIoc.Default.Register<INavigationService>(() => nav);

    SimpleIoc.Default.Register<IDialogService, DialogService>();

    if (ViewModelBase.IsInDesignModeStatic
            || UseDesignTimeData)
    {
        SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
    }
    else
    {
        SimpleIoc.Default.Register<IDataService, DataService>();
    }

    SimpleIoc.Default.Register<MainViewModel>();
}

public MainViewModel(
    IDataService dataService,
    INavigationService navigationService)
{
    _dataService = dataService;
    _navigationService = navigationService;
    Initialize();
}

private async Task Initialize()
{
    try
    {
        var item = await _dataService.GetData();
        WelcomeTitle = item.Title;
    }
    catch (Exception ex)
    {
        // Report error here
        WelcomeTitle = ex.Message;
    }
}

问题是这个示例非常简单,只有 MainPage 使用了 DataService,而我的应用有多个 Page,对应有多个 ViewModel,以及多个 DataService

  • DataService2

  • DataService3

  • DataService4

  • ...

这些 DataService 供不同 ViewModel 使用,就如上面的代码一样,但我不能重复注册,因为 IDataService 已经被注册过。

...
// 错误
SimpleIoc.Default.Register<IDataService, DataService2>();
SimpleIoc.Default.Register<IDataService, DataService3>();
SimpleIoc.Default.Register<IDataService, DataService4>();
...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

°如果伤别离去 2022-09-12 04:16:34

用 SimpleIoc 追求的就是单例的效果,DataService 如果有多个就 不是单例,当让就不能用 以上这种方式了,在每个 ViewModel 实例化就行了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文