C# 通过SimpleInjector注册一个单例,并为它实现的不同接口返回相同的实例

C# 通过SimpleInjector注册一个单例,并为它实现的不同接口返回相同的实例,c#,dependency-injection,inversion-of-control,ioc-container,simple-injector,C#,Dependency Injection,Inversion Of Control,Ioc Container,Simple Injector,想象一下,我有以下几点: 公共接口IocInterface1{} 公共接口IocInterface2{} 公共类IocImpl:IocInterface1,IocInterface2{} 我希望,如果我试图通过IoC获得上述类/接口的任何实例,我会得到完全相同的实例,而不是每种类型一个单例。例如,下面的b1和b2应该是正确的: \u container.RegisterSingle(); _container.RegisterSingle(); _container.RegisterSingl

想象一下,我有以下几点:

公共接口IocInterface1{}
公共接口IocInterface2{}
公共类IocImpl:IocInterface1,IocInterface2{}
我希望,如果我试图通过IoC获得上述类/接口的任何实例,我会得到完全相同的实例,而不是每种类型一个单例。例如,下面的
b1
b2
应该是正确的:

\u container.RegisterSingle();
_container.RegisterSingle();
_container.RegisterSingle();
var test1=_container.GetInstance();
var test2=_container.GetInstance();
var test3=_container.GetInstance();
boolb1=test1==test2;
boolb2=test2==test3;

这可能吗?

如果要使用相同的注册来注册多个类型,则需要为实现类型
IocImpl
注册一个单例注册对象

然后您需要使用
AddRegistration
为不同的服务添加此注册:
IocInterface1
IocInterface2
等:

var_container=newcontainer();
风险值登记=
Lifestyle.Singleton.CreateRegistration(_容器);
_container.AddRegistration(typeof(IocImpl),registration);
_容器.AddRegistration(typeof(IocInterface1),注册);
_容器.AddRegistration(typeof(IocInterface2),registration);
如文件所述:

或者,您也可以使用委托创建映射:

_container.RegisterSingle<IocImpl>();
_container.RegisterSingle<IocInterface1>(() => container.GetInstance<IocImpl>());
_container.RegisterSingle<IocInterface2>(() => container.GetInstance<IocImpl>());
\u container.RegisterSingle();
_container.RegisterSingle(()=>container.GetInstance());
_container.RegisterSingle(()=>container.GetInstance());

在大多数情况下,这两个示例在功能上是等效的,但前者是首选的。

这看起来很适合我的需要-但是,它是否也适合
container.RegisterSingleOpenGeneric()
?原因是我有一个程序集扫描仪,可以扫描我用自己创建的自定义属性修饰的所有类型,这也满足了开放泛型的需要。
RegisterSingleOpenGeneric
的工作原理有点不同,因为它在
ResolveUnregisteredType
事件中动态创建注册。。。我必须考虑如何在不重新引用
RegisterSingleOpenGeneric
方法的逻辑的情况下完成它。但我认为你应该问这是一个后续问题,你可以详细说明扫描如何工作,以及它如何尝试注册泛型类型。我同意@nemesv:请用这些细节问一个新问题。这个答案是正确的+1.@Steven我也找到了“委托解决方案”,我只是不确定如何在creator函数中引用
容器
。我已经在我的扫描仪中解决了这个问题,当我遇到
GenericTypeDefinition
时,我在那里执行“正常”逻辑,以及根据您的回答的逻辑,因此,这非常符合我的要求-谢谢!:)