我知道一些DI框架支持这种(例如 ),但我特别想知道如果这是可能的 Autofac.

我想要能够问Autofac容器,用于一个具体的类,并取回一个实例与所有适当构造的依赖注射, 而没有注册,具体类。 即, 如果我从来没有结合它明确,然后 自动 绑定的具体类本身,因为如果我已经被称为 builder.Register<MyClass>();

一个很好的例子时,这会是有用的是这个例子.中。,分层是这样的,只有认取决于模型,并通过松散的打字的,你不单元测试看也无妨。所以没有需要的模拟视图模型,用于测试--因此没有理由有一个接口,每个模型.因此,在这种情况下,通常迪模式的"注册这个界面来解决这类"是不必要的复杂性。明确的自我约束,就像 builder.Register<MyClass>();, 也感觉不必要步骤在处理一些简单作为一个具体的类。

我知道的 基于反射的登记示例 在Autofac文件,但这并不是我的口味。我不想要的复杂性(和慢)登记每一个可能类未来的时间;我想的框架,以得到我我需要什么当我需要它。《公约》在配置,而这一切。

是否有任何方式配置Autofac因此可以说"哦,这是一个具体的类型,没有人注册,所以我就像它已经注册的默认设置"?

有帮助吗?

解决方案

builder.RegisterTypesMatching(type => type.IsClass)

如果你 看看源 你会看到,RegisterTypesMatching(和RegisterTypesFromAssembly)不做任何反射。所有Autofac是做在这种情况是登记一项规则,接受一种类型或者不。在我上面的例子,我接受任何类型的一类。

在这种情况下的RegisterTypesFromAssembly,Autofac寄存器中的一项规则,说"如果该类型你试图解决有组==指定的组件,然后我会给你一个实例".

所以:

  1. 没有类型反映在注册时间
  2. 任何 类型相匹配的准则将会被解决

相比,对注册的具体类型的直接,这将具有性打击,在解决的时间,因为Autofac会有例如构造要求。这就是说,如果你默认的实例的范围,这是单身,你采取的打击只有第一时间解决这一类型。下一次,它将使用已经创造了单独的实例。

更新: 在Autofac2有一个更好的方式使容器能够解决任何东西。这涉及到 AnyConcreteTypeNotAlreadyRegistered 注册来源.

其他提示

什么:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());

没有反射被完成,如彼得Lillevold 指出

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top