2010-08-02 189 views
3

有没有一种方法可以将AutoFac设置为使用PropertiesAutowired(true)作为所有正在注册的类型的默认值。设置AutoFac默认使用PropertiesAutowired(true)?

即我不想用 “.PropertiesAutowired(真)” 的所有时间

var builder = new ContainerBuilder(); 
builder.RegisterType<Logger>() 
    .PropertiesAutowired(true) 
    .SingleInstance(); 

回答

9

这可以用模块来完成,例如,

class InjectPropertiesByDefaultModule : Autofac.Module { 
    protected override void AttachToComponentRegistration(
     IComponentRegistration registration, 
     IComponentRegistry registry) { 
      registration.Activating += (s, e) => { 
       e.Context.InjectProperties(e.Instance); 
      }; 
    } 
} 

然后:

builder.RegisterModule<InjectPropertiesByDefaultModule>(); 

我想你可能会误解true paramerter到PropertiesAutowired - 它决定如何依赖圆形的支持,并应可能保持false。要模拟true设置,您可以将其附加到Activated而不是上面的Activating

但是,如果可能的话,即使对于“可选”依赖项(如ILog)也要使用构造函数注入。它导致更清洁的组件(例如,字段可以被制造为readonly)并且依赖关系更易于理解(它们都在构造器中,并且没有关于单独属性的含义的猜测)。

只有在存在时才考虑使用属性注入是应用程序的多种配置,并且在某些配置中,依赖关系将确实不存在。

即使在这些情况下,“空对象”模式通常更合适。

+0

另外 - 如果你正在整合Log4Net,请看看:http://code.google.com/p/autofac/wiki/Log4NetIntegration :) – 2010-08-02 22:50:20

+0

Nic。在你的代码中,“e”来自哪里? – Simon 2010-08-03 02:38:29

+0

谢谢西蒙 - 应该是“注册” - 现在已经修复。 – 2010-08-03 05:59:50

0

没有,没有。虽然,如果你批量注册类型或按照惯例注册类型,它会更容易,例如,使用builder.RegisterAssemblyTypes(..)

更新:是的,有,请参阅@Nicholas answer

+0

正如我所料。谢谢 – Simon 2010-08-02 12:35:48