Autofac可以自动进行自我绑定吗?

Joe*_*ite 10 dependency-injection autofac convention-over-configur

我知道一些DI框架支持这个(例如Ninject),但我特别想知道它是否可以用于Autofac.

我希望能够向Autofac容器询问具体类,并返回一个注入了所有适当的构造函数依赖项的实例,而无需注册该具体类.也就是说,如果我从未明确地绑定它,那么就自动将具体类绑定到自身,就好像我已经调用了一样builder.Register<MyClass>();

一个很有用的例子是ViewModels.在MVVM中,分层是这样的,只有View依赖于ViewModel,并且通过松散键入,并且您不会对View进行单元测试.因此,无需为测试模拟ViewModel - 因此没有理由为每个ViewModel创建一个接口.因此,在这种情况下,通常的"注册此接口以解析此类"的DI模式是不必要的复杂性.明确的自我约束,builder.Register<MyClass>();在处理像具体类一样简单的事情时,也感觉像是一个不必要的步骤.

我知道Autofac文档中基于反射的注册示例,但这也不符合我的口味.我不希望提前注册每个可能的课程的复杂性(和缓慢); 我希望框架能够在需要时为我提供所需的内容.约定超过配置,以及所有这些.

有没有办法配置Autofac所以它可以说"哦,这是一个具体的类型,没有人注册它,所以我只是表现就像它已经注册了默认设置"?

Pet*_*old 14

builder.RegisterTypesMatching(type => type.IsClass)
Run Code Online (Sandbox Code Playgroud)

如果查看源代码,您将看到RegisterTypesMatching(和RegisterTypesFromAssembly)没有做任何反思.在这种情况下,所有Autofac都在注册一个接受类型的规则.在上面的例子中,我接受任何类的类型.

对于RegisterTypesFromAssembly,Autofac会注册一条规则,说明"如果您要解析的类型具有Assembly ==指定的程序集,那么我将为您提供一个实例".

所以:

  1. 注册时没有进行类型反射
  2. 任何符合条件的类型都将得到解决

与直接注册具体类型相比,这将在解析时具有性能,因为Autofac必须弄清楚例如构造函数要求.也就是说,如果您使用默认实例范围(单例),则只在第一次解析该类型时才执行命中.下次它将使用已经创建的单例实例.

更新:在Autofac 2中,有一种更好的方法可以使容器能够解决任何问题.这涉及到AnyConcreteTypeNotAlreadyRegistered登记源.