我必须使用Autofac显式绑定普通类吗?

时间:2012-07-04 04:34:06

标签: c# autofac

我似乎在我的代码中做了相当多的事情:

public class ActionsModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);
            builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILog>().InstancePerDependency();

            // Autofac doesn't seem to be able to inject things without explicit binding 
            builder.RegisterType<ComboActions>().As<ComboActions>().InstancePerHttpRequest();
            builder.RegisterType<AppActions>().As<AppActions>().InstancePerHttpRequest();
        }
    }
}

'actions'类是一个类,我需要将其注入到我的控制器中,并具有各种其他子依赖项。

似乎有点垃圾。为什么autofac无法解析该类是否具有已满足依赖关系的构造函数并自动生成实例?

我的意思是,如果A类需要注入B类而B类需要C,D,E等等,我想您不想走完整个依赖链,看看是否可以在运行。 ...但是如果A类直接依赖于明确约束的C和D,那肯定是一个微不足道的案例?

我错过了什么吗?似乎无法看到任何相关的文档...

2 个答案:

答案 0 :(得分:24)

您无需注册所有类型。 Autofac提供AnyConcreteTypeNotAlreadyRegisteredSource,如果您尚未提供注册,它将自动获取具体类型。

例如:

var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();
...
var myConcreteType = container.Resolve<MyConcreteType>();

源代码允许更复杂的东西,例如automatically injecting mocked objects用于接口和基于抽象类的依赖项。

答案 1 :(得分:2)

AFAIK,Autofac要求在容器中注册所有需要的类型,但这并不意味着您必须单独执行每个类型。几乎99%的注册都是通过将此属性添加到类型来处理的:

[AttributeUsage(AttributeTargets.Class)]
public class AutoRegisterAttribute : Attribute { }

例如,你有

[AutoRegister]
class ComboActions
{

然后我用这个注册:

public class AutoScanModule : Module
{
    private readonly Assembly[] _assembliesToScan;

    public AutoScanModule(params Assembly[] assembliesToScan)
    {
        _assembliesToScan = assembliesToScan;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(_assembliesToScan)
            .Where(t => t.GetCustomAttributes(typeof (AutoRegisterAttribute), false).Any())
            .AsSelf()
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
    }
}

就像我说的,这涵盖了我的大多数注册,然后我通常只需要担心第三方类型,开放式泛型和装饰器等事情。

编辑:查看证明我错误的reply from Kaleb。很酷的功能,我从来不知道!