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

9

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

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个回答

8

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

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

5

查看这里的源代码(CodePlex上的SimpleIoc.cs)揭示了问题所在。当使用register函数的这个重载时:

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

按预期,它将把TInterfaceTClass添加到一个字典中,其中接口是键,但它还会将TClass及其构造函数添加到另一个字典中,其中类是键,而不进行任何进一步的检查。
我怀疑这是一个错误,因为如果TClass已经被知道(即已添加到此构造函数查找映射中),它可以简单地使用该映射。

解决方案:

解决方案/解决方法是使用工厂类型的注册。这样做可以达到预期效果:

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

请注意,使用此解决方案将在每次访问两个接口之一时创建该类的新实例。 - Ted

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