Kar*_*sar 8 c# dependency-injection ioc-container inversion-of-control simple-injector
想象一下,我有以下内容:
public interface IocInterface1 { }
public interface IocInterface2 { }
public class IocImpl : IocInterface1, IocInterface2 { }
Run Code Online (Sandbox Code Playgroud)
我想如果我尝试通过IoC获取上述类/接口的任何实例,我得到完全相同的实例,而不是每个类型一个单例.例如,b1与b2以下应该是真实的:
_container.RegisterSingle<IocInterface1, IocImpl>();
_container.RegisterSingle<IocInterface2, IocImpl>();
_container.RegisterSingle<IocImpl, IocImpl>();
var test1 = _container.GetInstance<IocInterface1>();
var test2 = _container.GetInstance<IocInterface2>();
var test3 = _container.GetInstance<IocImpl>();
bool b1 = test1 == test2;
bool b2 = test2 == test3;
Run Code Online (Sandbox Code Playgroud)
这可能吗?
nem*_*esv 11
如果要注册具有相同注册的多个类型,那么您将需要一个用于实现类型的单例注册对象IocImpl.
然后,你需要使用AddRegistration添加此注册为不同的服务:IocInterface1,IocInterface2等:
var _container = new Container();
var registration =
Lifestyle.Singleton.CreateRegistration<IocImpl, IocImpl>(_container);
_container.AddRegistration(typeof(IocImpl), registration);
_container.AddRegistration(typeof(IocInterface1), registration);
_container.AddRegistration(typeof(IocInterface2), registration);
Run Code Online (Sandbox Code Playgroud)
如文档中所述:使用相同的实现注册多个接口
或者,您也可以使用委托进行映射:
_container.RegisterSingle<IocImpl>();
_container.RegisterSingle<IocInterface1>(() => container.GetInstance<IocImpl>());
_container.RegisterSingle<IocInterface2>(() => container.GetInstance<IocImpl>());
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,两个例子在功能上都是等同的,但前者是优选的.