【问题标题】:Can Autofac do automatic self-binding?Autofac 可以做自动自绑定吗?
【发布时间】:2009-07-09 05:00:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: dependency-injection autofac convention-over-configur


    【解决方案1】:
    builder.RegisterTypesMatching(type => type.IsClass)
    

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

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

    所以:

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

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

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

    【讨论】:

    • Sweet -- 听起来正是我想要的。谢谢!
    【解决方案2】:

    怎么样:

    builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());
    

    没有进行任何反思,就像 Peter Lillevold points out

    【讨论】:

    • 删除了我以前的 cmets,因为您是对的(正如您在编辑中澄清的那样):RegisterTypesFromAssembly 不会像其名称所暗示的那样进行质量反射。它只是RegisterTypesMatching 的一系列速记函数中的一个,并且完全符合我的要求,但具有更细粒度的控制,非常棒。对于第一次误解您的回答,我深表歉意。
    • 请原谅我,但这个答案已经 3 岁了:P 此外,从那时起,autofac 发生了很多事情,我认为这些都不再相关了..
    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 2012-10-18
    • 2012-07-07
    • 2013-03-20
    • 1970-01-01
    • 2010-12-10
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多