7

我似乎在我的代码中这样做了一点:

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();
        }
    }
}

“动作”类是我需要注入到我的控制器中的类,并且具有各种其他子依赖项。

好像有点垃圾 为什么 autofac 不能解析该类具有已满足依赖关系的构造函数并自动制造实例?

我的意思是,如果 A 类需要注入 B 类,而 B 类需要 C、D、E 等。公平地说,我猜你不想遍历整个依赖链来查看是否可以在运行时创建一个类。...但是如果 A 类直接依赖于明确绑定的 C 和 D,那肯定是微不足道的情况吗?

我错过了什么吗?似乎看不到任何有关此的文档...

4

2 回答 2

26

您不必注册每种类型。Autofac 提供了一个AnyConcreteTypeNotAlreadyRegisteredSource,如果您尚未提供注册,它将自动获取具体类型。

例如:

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

源代码允许更复杂的事情,例如为接口和基于抽象类的依赖项自动注入模拟对象。

于 2012-07-13T03:52:46.417 回答
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();
    }
}

就像我说的,这涵盖了我的大部分注册,然后我通常只需要担心诸如 3rd 方类型、开放泛型和装饰器之类的事情。

编辑:查看Kaleb 的回复,证明我错了。我从来不知道的酷功能!

于 2012-07-12T12:24:03.197 回答