10

我知道一些 DI 框架支持这一点(例如Ninject),但我特别想知道Autofac是否有可能。

我希望能够向 Autofac 容器询问具体类,并返回一个注入了所有适当构造函数依赖项的实例,而无需注册该具体类。即,如果我从不显式绑定它,则自动将具体类绑定到自身,就好像我调用了builder.Register<MyClass>();

一个很好的例子就是 ViewModels。在 MVVM 中,分层是这样的,即只有 View 依赖于 ViewModel,并且通过松散的类型来实现,并且无论如何您都不会对 View 进行单元测试。所以没有必要模拟 ViewModel 进行测试——因此没有理由为每个 ViewModel 提供一个接口。所以在这种情况下,通常的 DI 模式“注册这个接口来解析这个类”是不必要的复杂性。builder.Register<MyClass>();在处理像具体类这样简单的事情时,显式的自绑定,比如,也感觉像是一个不必要的步骤。

我知道Autofac 文档中基于反射的注册示例,但这也不符合我的口味。我不希望提前注册每个可能的课程的复杂性(和缓慢性);我希望框架在我需要的时候给我我需要的东西。约定优于配置,等等。

有什么方法可以配置 Autofac,让它可以说“哦,这是一个具体的类型,还没有人注册它,所以我就让它像使用默认设置注册一样”?

4

2 回答 2

14
builder.RegisterTypesMatching(type => type.IsClass)

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

在 RegisterTypesFromAssembly 的情况下,Autofac 注册了一条规则,上面写着“如果您尝试解析的类型具有 Assembly == 指定的程序集,那么我会给您一个实例”。

所以:

  1. 注册时不进行类型反射
  2. 任何符合条件的类型都将被解析

与直接注册具体类型相比,这将在解析时产生性能影响,因为 Autofac 必须弄清楚例如构造函数的要求。也就是说,如果您使用默认实例范围(即单例),那么您只有在第一次解析该类型时才会受到影响。下次它将使用已经创建的单例实例。

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

于 2009-07-20T16:06:01.417 回答
2

关于什么:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());

正如 Peter Lillevold指出的那样,没有进行任何反思。

于 2009-07-15T22:16:29.713 回答