我想要一个具体类的Autofac容器,并返回一个注册了所有适当的构造函数依赖关系的实例,而不用注册这个具体的类.即,如果我没有明确绑定,那么自动将具体类绑定到自己,就好像我已经调用builder.Register< MyClass>();
这是一个很有用的例子,就是viewmodels.在MVVM中,分层是这样的,只有视图取决于viewmodel,而通过松散打字,并且您不会对View进行单元测试.所以没有必要模拟viewmodel进行测试,因此没有理由为每个viewmodel都有一个接口.所以在这种情况下,通常的“注册此接口来解决这个类”的DI模式是不必要的复杂性.显式的自我约束,如builder.Register< MyClass>();在处理与具体类一样简单的东西时也感觉像一个不必要的步骤.
我知道Autofac文档中的reflection-based registration example,但这不是我的口味.我不想提前注册每个可能的类别的复杂性(和缓慢);我想框架给我需要的时候我需要的.公约超过配置,所有这一切.
builder.RegisterTypesMatching(type => type.IsClass)
如果您使用look at the source,您将看到RegisterTypesMatching(和RegisterTypesFromAssembly)没有任何反映.在这种情况下,所有Autofac都在注册接受类型的规则.在我上面的例子中,我接受任何类型的类.
在RegisterTypesFromAssembly的情况下,Autofac会注册一条规则,说明“如果您想要解决的类型具有Assembly ==指定的程序集,那么我将给你一个实例”.
所以:
与直接注册具体类型相比,这将在解决时间内有一个惊喜,因为Autofac将必须弄清楚例如构造函数要求.也就是说,如果您使用默认实例范围(即单例),则只能在第一次解析该类型时执行命中.下一次它将使用已经创建的单例实例.
更新:在Autofac 2中有一个更好的方式使容器能够解决任何事情.这涉及the AnyConcreteTypeNotAlreadyRegistered
registration source.