gpt4 book ai didi

dependency-injection - Autofac可以自动自绑定(bind)吗?

转载 作者:行者123 更新时间:2023-12-02 14:08:55 24 4
gpt4 key购买 nike

我知道一些 DI 框架支持此功能(例如 Ninject ),但我特别想知道 Autofac 是否可以.

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

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

我知道 reflection-based registration example在 Autofac 文档中,但这也不符合我的口味。我不希望提前注册每个可能的类的复杂性(和缓慢);我希望框架能够在我需要时为我提供所需的东西。约定优于配置,等等。

是否有任何方法可以配置 Autofac,以便它可以说“哦,这是一个具体类型,还没有人注册它,所以我就好像它已使用默认设置注册一样”?

最佳答案

builder.RegisterTypesMatching(type => type.IsClass)

如果您look at the source您将看到 RegisterTypesMatching(和 RegisterTypesFromAssembly)没有进行任何反射。在这种情况下,Autofac 所做的就是注册一个接受或不接受类型的规则。在上面的示例中,我接受任何属于类的类型。

对于 RegisterTypesFromAssembly,Autofac 注册一条规则,表示“如果您尝试解析的类型具有 Assembly == 指定的程序集,那么我将为您提供一个实例”。

所以:

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

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

更新:在 Autofac 2 中,有一种更好的方法使容器能够解决任何问题。这涉及the AnyConcreteTypeNotAlreadyRegistered registration source .

关于dependency-injection - Autofac可以自动自绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com