2015-04-01 72 views
3

我在我的项目中使用IoC容器,但是我的项目包含许多子模块。我想使用一个基本的IoC模块。 例子: 我有两个接口子模块一个 这是卓智和ITwo的接口创建整个IoC容器

public interface ITwo 
{ 
    // some code 
} 

public interface IOne 
{ 
    // some code 
} 

而且我SimpleInjectorRegisterTypes

public class SimpleInjectorRegisterTypes : ISimpleInjectorRegistration 
    { 
     public void Register(Container container) 
     { 
      container.RegisterSingle<ITwo, Two>(); 
      container.RegisterSingle<IOne, One>(); 
     } 
    } 

而且主类,在这里我用我的逻辑

private static IOne _one; 
     private static ITwo _two; 

     static void Main(string[] args) 
     { 
      Container container = new Container(); 
      new SimpleInjectorRegisterTypes().Register(container); 
      _one= container.GetInstance<IOne>(); 
      _two= container.GetInstance<ITwo>(); 
     } 

这是好的,但我有submodule B其中我有接口IThree和TFour 和SimpleInjectorRegisterTypes和主类。 如何为我所有的子模块写一个通用的IoC容器? P.S.对于IoC,我使用bootstrapper

+0

为什么要在多个地方注册依赖关系?为什么不在你的应用程序入口点做所有'bootstrapping'? – 2015-04-01 07:35:01

+0

所以你有:一个容器,你注册你的接口/类对,然后你有一个接口/类对只是做注册 - 然后你使用所有的只是在静态类中创建你的接口的两个静态实例...是不是有点**过度杀伤? – Carsten 2015-04-01 07:39:21

+0

我有独立的模块,我有(如果可能的话)创建一个整体的IoC容器,该怎么做? – 2015-04-01 07:45:35

回答

1

假设有3个子组件,例如Common,ModuleAModuleB

  • CommonICommon接口和你的ISimpleInjectorRegistration接口。
  • ModuleA具有CommonA器具ICommon,其独立注册(IOneOneITwoTwo
  • ModuleB具有CommonB实现ICommon,其注册(IThreeThreeIFourFour

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将包含CommonACommonB实例。

问题是,注册依赖关系时应该保持简单。只有一个地方是理想的,但是如果你有独立的模块并且每个模块都不知道彼此,那么知道这两个模块的'主'应该正确配置注册。