【问题标题】:IoC container in MVVMLight - How to pass concrete implementation to the specified element?MVVMLight 中的 IoC 容器 - 如何将具体实现传递给指定元素?
【发布时间】:2014-07-27 10:03:21
【问题描述】:

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

关键是,我想为MainViewModel 提供DataService2,而不是另一个。我怎样才能做到这一点?我尝试“键入”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 无法解决 - 据我所知,如果我想解决 keyed MainViewModel ("B"),所有它的依赖项必须被键入。这不是我想要的——我想解析具有默认依赖项的MainViewModel,除了那个。

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

【问题讨论】:

  • 确切的异常消息是什么?
  • @RomanKo 我收到了 ActivationException。附加信息:在没有键的情况下在缓存中找不到类型:ViewModels.MainViewModel

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


【解决方案1】:

不想这么说,但它看起来是唯一的方法。您必须注册一个密钥工厂:

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

【讨论】:

  • 是的,我得出了同样的结论。但它实际上违背了使用 IoC-Container 的目的——因为类 X、Y、Z 有它们自己的依赖项,现在我必须提供这些依赖项。谢谢你的意见!我再等一会儿,如果没有人回答,我会接受你的回答。
  • @Malutek:是的。因此得名:简单 Ioc.
  • @romanoza 你知道任何可以以更优雅的方式做到这一点的 Ioc 吗?
猜你喜欢
  • 2014-03-16
  • 2014-06-22
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2015-07-18
  • 2014-11-14
  • 2019-10-04
  • 2015-09-29
相关资源
最近更新 更多