MVVMLight中的IoC容器-如何传递具体的实现到指定的元素

本文关键字:实现 元素 IoC 中的 容器 何传递 MVVMLight | 更新日期: 2023-09-27 18:14:57

我目前正在努力解决Mvvm Light的IoC容器的以下问题-我有一个接口IDataService,这是由两个类实现的:DataService1DataService2。我也有MainViewModel类,有许多依赖关系,其中一个是IDataService

关键是,我想用DataService2提供MainViewModel,而不是另一个。我该怎么做呢?我试图"键"IDataServiceMainViewModel的两个实例,像这样:

class MainViewModel 
{
    // MainViewModel has many dependencies, 
    public MainViewModel(X x, Y y, Z z, M m, N n, IDataService dataService) { }
}
(...)
SimpleIoc.Default.Register<IDataService>(() => new DataService1(), "A");
SimpleIoc.Default.Register<IDataService>(() => new DataService2(), "B");

(...)
var viewModel = SimpleIoc.Default.GetInstance<MainViewModel>("B"); // Runtime exception

,但我得到运行时异常,基本上说MainViewModel不能被解决-从我所理解的,如果我想解决 MainViewModel("B"),它的所有依赖关系必须被键化。这不是我想要的-我想解决MainViewModel有默认的依赖关系,除了一个。

我该怎么做呢?我显然漏掉了什么。谢谢你的帮助。

MVVMLight中的IoC容器-如何传递具体的实现到指定的元素

不想这么说,但这似乎是唯一的方法。你必须注册一个键控工厂:

SimpleIoc.Default.Register<MainViewModel>(() => new MainViewModel(new X(), new Y(), new Z(), new M(), new N(), SimpleIoc.Default.GetInstance<IDataService>("B")), "B");