Dependency injection Autofac是否可以进行自动自绑定?

Dependency injection Autofac是否可以进行自动自绑定?,dependency-injection,autofac,convention-over-configur,Dependency Injection,Autofac,Convention Over Configur,我知道一些DI框架支持这一点(例如),但我特别想知道它是否可以与 我希望能够向一个Autofac容器请求一个具体类,并返回一个注入了所有适当构造函数依赖项的实例,而无需注册该具体类。即,如果我从未显式绑定它,则会自动将具体类绑定到自身,就像我调用了builder.Register(); ViewModels就是一个很好的例子,说明这一点何时有用。在MVVM中,分层是这样的,即只有视图依赖于ViewModel,并且通过松散的键入,您不必对视图进行单元测试。因此,不需要为测试模拟ViewModel—

我知道一些DI框架支持这一点(例如),但我特别想知道它是否可以与

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

ViewModels就是一个很好的例子,说明这一点何时有用。在MVVM中,分层是这样的,即只有视图依赖于ViewModel,并且通过松散的键入,您不必对视图进行单元测试。因此,不需要为测试模拟ViewModel——因此没有理由为每个ViewModel都提供一个接口。因此在这种情况下,通常的DI模式“注册此接口以解析到此类”是不必要的复杂性。显式自绑定,如
builder.Register(),也感觉像是不必要的步骤

我知道Autofac文档中存在的问题,但这也不符合我的口味。我不希望提前注册每一个可能的类的复杂性(和缓慢性);我希望这个框架能在我需要的时候提供我所需要的。约定优先于配置等等

有没有办法配置Autofac,让它可以说“哦,这是一个具体的类型,还没有人注册它,所以我会假装它已经注册了默认设置”?

关于:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());
正如彼得·利勒沃德(Peter Lillevold)所说,没有进行反思

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

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

因此:

  • 在注册时不进行类型反射
  • 任何符合条件的类型都将被解析
  • 与直接注册具体类型相比,这将在解析时产生性能影响,因为Autofac将必须确定例如构造函数要求。也就是说,如果使用默认的实例范围,即singleton,那么只有在第一次解析该类型时才会遇到问题。下次它将使用已经创建的单例实例


    更新:在Autofac 2中,有一种更好的方法使容器能够解析任何内容。这包括。

    Sweet——听起来正是我想要的。谢谢删除了我以前的评论,因为你是对的(正如你在编辑中澄清的):RegisterTypesFromAssembly并不像它的名字所暗示的那样进行大规模反射。它只是RegisterTypesMatching附近的一系列速记函数中的一个,它完全符合我的要求,但它具有更细粒度的控制,这非常好。我很抱歉第一次误解了你的答案。请原谅我,这个答案已经3年了:P此外,自那以后,autofac发生了很多事情,我认为这些都不再相关了。。
    builder.RegisterTypesMatching(type => type.IsClass)