假设有3个子组件,例如Common
,ModuleA
和ModuleB
。
Common
有ICommon
接口和你的ISimpleInjectorRegistration
接口。
ModuleA
具有CommonA
器具ICommon
,其独立注册(IOne
:One
,ITwo
:Two
)
ModuleB
具有CommonB
实现ICommon
,其注册(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
将是ICommon
序列包含单CommonB
实例。
您可能想获得CommonA
作为ICommon
。或获得的ICommon
所有实现为IEnumerable<ICommon>
:
var container3 = new Container();
container3.Options.AllowOverridingRegistrations = true;
new ModuleA.Registration().Register(container3);
new ModuleB.Registration().Register(container3);
// you can choose which ICommon should be registered.
container3.Register<ICommon, ModuleA.CommonA>();
// or collect all implementation of ICommon
// (of course using Assembly.GetTypes() is better solution)
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
实例。
问题是,注册依赖关系时应该保持简单。只有一个地方是理想的,但是如果你有独立的模块并且每个模块都不知道彼此,那么知道这两个模块的'主'应该正确配置注册。
为什么要在多个地方注册依赖关系?为什么不在你的应用程序入口点做所有'bootstrapping'? – 2015-04-01 07:35:01
所以你有:一个容器,你注册你的接口/类对,然后你有一个接口/类对只是做注册 - 然后你使用所有的只是在静态类中创建你的接口的两个静态实例...是不是有点**过度杀伤? – Carsten 2015-04-01 07:39:21
我有独立的模块,我有(如果可能的话)创建一个整体的IoC容器,该怎么做? – 2015-04-01 07:45:35