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

时间:2014-07-27 10:03:21

标签: c# dependency-injection mvvm-light ioc-container

我目前正在努力解决来自Mvvm Light的IoC容器的问题 - 我有一个接口IDataService,它由两个类实现:DataService1DataService2。我还有MainViewModel类,它有很多依赖项,其中一个是IDataService

关键是,我想提供MainViewModel DataService2,而不是另一个。{1}}。我怎样才能做到这一点?我试图“锁定”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,除了那个。

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

1 个答案:

答案 0 :(得分:2)

讨厌说,但它看起来是唯一的方式。您必须注册一个键控工厂:

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