将AutoFac设置为默认使用PropertiesAutowired(true)?

时间:2010-08-02 03:30:28

标签: .net dependency-injection ioc-container

有没有办法可以将AutoFac设置为使用PropertiesAutowired(true)作为所有注册类型的默认值。

即。我不想一直使用“.PropertiesAutowired(true)”

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

2 个答案:

答案 0 :(得分: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 PropertiesAutowired的参数 - 它决定了循环依赖关系的支持方式,应该保持false。要模拟true设置,您可以将其附加到Activated而不是上面的Activating

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

只有在应用程序有多个配置时才考虑使用属性注入,在某些配置中,依赖关系将完全不存在。

即使在这些情况下,“Null Object”模式通常也更合适。

答案 1 :(得分:0)

不,没有。但是,如果您按批量或按惯例注册类型,则会更容易,例如使用builder.RegisterAssemblyTypes(..)

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