为何Autofac无法解析我的BidDataProvider类的构造函数?
我来帮你梳理下可能导致这个问题的几个常见点,你可以逐一核对排查:
构造函数参数未注册到容器
Autofac解析类型时,会优先找它能完全解析所有参数的构造函数。如果你的BidDataProvider构造函数里存在未在Autofac中注册的依赖类型,容器就会报错找不到合适的构造函数。举个例子:public class BidDataProvider : DataProviderBase, IBidDataProvider { // 这里的ISomeUnregisteredService没在容器中注册 public BidDataProvider(ISomeUnregisteredService service) { // ... } }你需要检查构造函数的所有参数,确保每个依赖都已在Autofac模块中完成注册。
接口与实现的注册不匹配
如果你注册的是IBidDataProvider对应BidDataProvider,但在NServiceBus处理器里直接请求BidDataProvider具体类型,或者反过来,都会导致解析失败。比如注册代码是:builder.RegisterType<BidDataProvider>().As<IBidDataProvider>();但处理器构造函数是:
public class BidMessageHandler { // 这里直接请求具体类型,而非注册的接口 public BidMessageHandler(BidDataProvider provider) { // ... } }这种情况要么修改注册代码加上
AsSelf(),要么在处理器里注入对应的IBidDataProvider接口。基类
DataProviderBase的依赖未被处理
如果DataProviderBase有带参数的构造函数,且BidDataProvider没有显式定义自己的构造函数,那么它会继承基类的构造函数。这时候Autofac需要能解析基类构造函数的所有参数。比如基类是:public abstract class DataProviderBase { public DataProviderBase(IDbConnection connection) { // ... } }那你必须确保
IDbConnection已经注册到Autofac容器中,否则解析BidDataProvider时会因为基类依赖缺失报错。NServiceBus与Autofac的集成配置有误
如果你用Autofac作为NServiceBus的DI容器,必须确保集成配置正确。比如有没有在EndpointConfiguration中指定使用Autofac容器:var builder = new ContainerBuilder(); // 注册你的各类服务... var container = builder.Build(); var endpointConfiguration = new EndpointConfiguration("YourEndpointName"); endpointConfiguration.UseContainer<AutofacBuilder>(c => c.ExistingContainer(container));要是集成不对,NServiceBus可能没用到你配置好的Autofac容器,自然找不到依赖。
构造函数的访问修饰符不是public
Autofac默认只能解析public的构造函数,如果你的BidDataProvider构造函数是internal或private,容器根本找不到它。检查下构造函数的修饰符,确保是public:public class BidDataProvider : DataProviderBase, IBidDataProvider { // 必须是public修饰符 public BidDataProvider(/* 参数 */) { // ... } }
你可以先从这几个方向入手排查,这类构造函数解析失败的问题,大多是以上某一个原因导致的。
内容的提问来源于stack exchange,提问作者Paul

