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

3
我目前在使用Mvvm Light的IoC容器时遇到了一个问题 - 我有一个接口IDataService,由两个类实现:DataService1DataService2。我还有一个MainViewModel类,它有许多依赖项,其中一个是IDataService
问题是,我想为MainViewModel提供DataService2而不是另一个。我尝试给IDataServiceMainViewModel的两个实例都设置“key”来达到这个目的,就像这样:
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,除了其中一个依赖项。

我应该怎么做?显然我漏掉了一些东西。谢谢您提前的帮助。


确切的异常信息是什么? - romanoza
https://dev59.com/fHfZa4cB1Zd3GeqPWtZN - Derek Beattie
@RomanKo 我遇到了ActivationException异常。额外信息:在缓存中找不到键为ViewModels.MainViewModel的类型。 - Malutek
1个回答

2
抱歉要说,但看起来这是唯一的方法。您需要注册一个键控工厂:
SimpleIoc.Default.Register<MainViewModel>(() => new MainViewModel(new X(), new Y(), new Z(), new M(), new N(), SimpleIoc.Default.GetInstance<IDataService>("B")), "B");

是的,我得出了同样的结论。但这实际上违背了使用IoC容器的目的 - 因为X、Y、Z类有它们自己的依赖项,现在我必须提供它们。不过还是谢谢你的回答!我会再等一会儿,如果没有人回答,我就接受你的回答。 - Malutek
@Malutek:是的,因此才叫做“简单”Ioc。 - romanoza
@romanoza,你知道有没有更优雅的Ioc可以实现它? - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接