假设这种情况:
public class B {};
public class C
{
public C(B b){}
}
要从 Autofac 容器中解析 C,我必须将 B 和 C 都注册到容器中。但是,今天我使用了Unity,看来我只需要将 B 注册到容器中,然后 C 就可以解决了。
所以 Autofac 不能像 Unity 那样做?
使用开箱即用的 Autofac,预计您要使用的每种类型都在容器中注册,直接使用Register...方法或批量使用RegisterAssemblyTypes. 但也有其他选择,请查看Nicholas 关于解决所有问题的文章。所以是的,Autofac 可以做 Unity 所做的事情,但您必须启用它。
更新:实际上,“解决任何问题”功能现在是内置的,您可以执行以下操作:
var cb = new ContainerBuilder();
cb.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
return cb.Build();
使用 ,AnyConcreteTypeNotAlreadyRegisteredSource您实际上可以解决这两个问题C,而B无需注册其中任何一个。
请注意,所解析的服务的生命周期AnyConcreteTypeNotAlreadyRegisteredSource将是“每个依赖范围”。
注意: Autofac 讨论组中的这个主题是相关的。