我知道一些DI框架支持此功能(例如Ninject),但是我特别想知道Autofac是否可行。
我希望能够向Autofac容器询问具体的类,并返回一个实例,该实例注入(inject)了所有适当的构造函数依赖项,而无需注册该具体的类。 ,即,如果我从不明确绑定(bind)它,则自动将具体类与其自身绑定(bind),就好像我调用了builder.Register<MyClass>();
ViewModels就是一个很好的例子。在MVVM中,这种分层使得只有View依赖于ViewModel,并且通过松散类型进行依赖,并且您无论如何都不会对View进行单元测试。因此,无需模拟ViewModel进行测试-因此,没有理由为每个ViewModel都有一个接口(interface)。因此,在这种情况下,通常的“注册此接口(interface)以解析为此类”的DI模式是不必要的复杂性。像builder.Register<MyClass>();
这样的显式自绑定(bind)在处理像具体类这样简单的事情时也感觉像是不必要的步骤。
我知道Autofac文档中的reflection-based registration example,但这也不符合我的口味。我不希望提前注册每个可能的类(class)的复杂性(和缓慢性)。我希望框架能在需要时提供所需的信息。约定优于配置,以及所有这些。
有什么方法可以配置Autofac,以便它可以说:“哦,这是一个具体类型,还没有人注册,所以我就好像它是使用默认设置注册的一样”?
最佳答案
builder.RegisterTypesMatching(type => type.IsClass)
如果您look at the source,您将看到RegisterTypesMatching(和RegisterTypesFromAssembly)没有做任何反射(reflection)。在这种情况下,Autofac所做的全部工作就是注册一个接受或不接受类型的规则。在上面的示例中,我接受属于类的任何类型。
对于RegisterTypesFromAssembly,Autofac会注册一条规则,说“如果您要解析的类型具有Assembly ==指定的程序集,那么我会给您一个实例”。
所以:
与直接注册具体类型相比,由于Autofac必须找出例如构造函数要求。就是说,如果使用默认实例范围(即单例),则仅在首次解析该类型时才进行匹配。下次它将使用已经创建的单例实例。
更新:Autofac 2中的有一种更好的方法可以使容器能够解析任何内容。这涉及the
AnyConcreteTypeNotAlreadyRegistered
registration source。关于dependency-injection - Autofac可以自动进行自动绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1101905/