如何在MVVM Light的SimpleIoc中注册实现多个接口的类?

时间:2015-04-02 16:39:29

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

我们说我有几个接口和一个实现它们的类:

public interface ISomething1 { /* blablabla */ }
public interface ISomething2 { /* blablabla */ }
public class Service : ISomething1, ISomething2 { /* blablabla x 2 */ }

我想在SimpleIoc中使用这两个接口注册该类:

SimpleIoc.Default.Register<ISomething1, Service >();
SimpleIoc.Default.Register<ISomething2, Service >();

然而,第二行会抛出 ArgumentException 并显示以下消息:

  

已添加具有相同键的项目。

我认为这里的关键是界面本身,但显然情况并非如此。我的想法是使用显式密钥,但是我想通过依赖注入来获取实例,其中IoC只能与无密钥注册表一起使用。

那么如何在不改变任何接口或实现本身的情况下在这里使用SimpleIoc?

2 个答案:

答案 0 :(得分:6)

这可能是一个更好的解决方案,因为Service()构造函数可以在ioc容器中注册依赖项。

SimpleIoc.Default.Register<Service>();
SimpleIoc.Default.Register<ISomething1>(() => SimpleIoc.Default.GetInstance<Service>());
SimpleIoc.Default.Register<ISomething2>(() => SimpleIoc.Default.GetInstance<Service>());

答案 1 :(得分:5)

查看此处的源代码(SimpleIoc.cs on CodePlex)已经揭示了问题所在。使用寄存器功能的这个重载时:

public void Register<TInterface, TClass>(bool createInstanceImmediately)

如预期的那样,它会将 TInterface TClass 添加到接口为键的字典中,但它也会添加 TClass 及其构造函数到另一个字典,其中类是密钥而没有任何进一步的检查。

我怀疑这是一个错误,好像TClass已经知道(即添加到这个构造函数的查找映射中),它可以简单地使用它。


解决方案:

解决方案/解决方法是使用工厂类型的注册。这按预期工作:

SimpleIoc.Default.Register<ISomething1>(() => new Service());
SimpleIoc.Default.Register<ISomething2>(() => new Service());