2

A.简单的问题。统一:默认和条件解析

我有3个“存储库”实例取决于“配置”。

class Manager{ 
    public Manager(Configuration conf){ 
... 

3个实例解决策略:

container.RegisterType<Repository>("ForService1"); 
container.RegisterType<Repository>("ForService2"); 
container.RegisterType<Repository>("ForService3"); 

(3,因为它们具有不包含到样品的附加参数,即总是不同的参数)

和“默认”的配置

container.RegisterType<Configuration>(new InjectionConstructor(new object[] { false, true })); 

我想提供重新定义t他在配置文件中配置一个且只有一个实例。

<register type="Configuration" 
       name="**ForService2**"> 
     <constructor> 
     <param name = "useOptimization1" value="True"/> 
     <param name = "useOptimization2" value="True"/> 
     </constructor> 
    </register> 

,并希望避免有在扩展类似三重配置:

container.RegisterType<Configuration>("ForService1", new InjectionConstructor(new object[] { false, true })); 
container.RegisterType<Configuration>("ForService1", new InjectionConstructor(new object[] { false, true })); 
container.RegisterType<Configuration>("ForService2", new InjectionConstructor(new object[] { false, true })); 

这可能吗?怎么样?

B.复杂的问题。

我感觉IoC工具不是关于配置。尝试配置基础设施丢弃IoC配置文件 - 又是一个反模式。或更短:“配置信息数据不是依赖性”。我对吗?

让我们观察EntLib的列表器配置。 真的,EntLib的日志监听器配置是“后期绑定”还是“配置方式”?首先,这是“后期绑定”(因为我们指出了类型名称 - 要创建哪个程序集和Loa以及对象),这也是“配置”(我们有自定义配置部分)。我觉得大多数IoC追随者会选择容器的启用“配置”,对吗? 但EntLib人选择配置部分。 可能是这个自定义配置部分日志监听器的配置将改变容器的配置,并且“监听器配置”应该如何与容器配置相关?

回答

1

我想确认最好的方法是从代码配置容器,甚至不仅仅是从代码配置容器,而是从明智的覆盖代码。 终极样本是从“构造lambda表达式库”的EntLib的配置:

http://msdn.microsoft.com/en-us/magazine/ee335709.aspx

yield return new TypeRegistration<Database>(
     () => new SqlDatabase(
      ConnectionString, 
      Container.Resolved<IDataInstrumentationProvider>(Name))) 
     { 
      Name = Name, 
      Lifetime = TypeRegistrationLifetime.Transient 
     }; 

这样的结构将在后面解释建集装箱配置!

1

回答

使用的容器与约定优于配置的支持。你可以看到一个比较图表here

应答b

正确的,国际奥委会不应该是配置。相反,prefer code as configuration,优选地以编码惯例的形式。

+0

谢谢你的回答,马克。但是我需要补充一点,在阅读“首选代码作为配置”链接后,我仍然不同意你的配置和“后期绑定”之间有明确的粗线。我已经向该问题添加了示例。 –