假设有三个子装配件,分别为
Common
、
ModuleA
和
ModuleB
。
Common
有ICommon
接口和您的ISimpleInjectorRegistration
接口。
ModuleA
具有实现ICommon
的CommonA
,以及其独立注册(IOne
:One
,ITwo
:Two
)
ModuleB
有实现ICommon
的CommonB
,以及其注册(IThree
:Three
,IFour
:Four
)
ModuleA
像这样注册:
public class RegistrationA : ISimpleInjectorRegistration
{
public void Register(Container container)
{
container.Register<IOne, One>();
container.Register<ITwo, Two>();
container.Register<ICommon, CommonA>();
container.RegisterAll<ICommon>(typeof(CommonA));
}
}
而且,ModuleB
是这样注册的:
public class RegistrationB : ISimpleInjectorRegistration
{
public void Register(Container container)
{
container.Register<IThree, Three>();
container.Register<IFour, Four>();
container.Register<ICommon, CommonB>();
container.RegisterAll<ICommon>(typeof (CommonB));
}
}
现在,在主模块中,您可以这样做:
var container = new Container();
new ModuleA.RegistrationA().Register(container);
new ModuleB.RegistrationB().Register(container);
container.Verify();
但是在
ModuleB
的注册中失败了,因为
ICommon
在两个注册中都有重复。
您可以通过使用
Options.AllowOverridingRegistrations
避免重复注册并强制替换为最新的。
var container2 = new Container();
container2.Options.AllowOverridingRegistrations = true;
new ModuleA.Registration().Register(container2);
new ModuleB.Registration().Register(container2);
container2.Options.AllowOverridingRegistrations = false;
container2.Verify();
var commonInstance2 = container2.GetInstance<ICommon>();
var commonInstances2 = container2.GetAllInstances<ICommon>();
作为结果,
commonInstance2
将成为
CommonB
的实例,而
commonInstances2
将是一个包含单个
CommonB
实例的
ICommon
序列。
你可能想要将
CommonA
作为
ICommon
。或者获取所有实现
ICommon
的类作为
IEnumerable<ICommon>
:
var container3 = new Container();
container3.Options.AllowOverridingRegistrations = true;
new ModuleA.Registration().Register(container3);
new ModuleB.Registration().Register(container3);
container3.Register<ICommon, ModuleA.CommonA>();
container3.RegisterAll<ICommon>(typeof (ModuleA.CommonA), typeof (ModuleB.CommonB));
container3.Options.AllowOverridingRegistrations = false;
container3.Verify();
var commonInstance3 = container3.GetInstance<ICommon>();
var commonInstances3 = container3.GetAllInstances<ICommon>();
作为结果,
commonInstance3
将是
CommonA
实例,
commonInstances3
将包含
CommonA
和
CommonB
实例。
重点是,在注册依赖关系时应该保持简单。只有一个地方是理想的,但如果您拥有独立的模块且每个模块不知道彼此,则了解两个模块的 'Main' 应正确配置注册信息。