Autofac泛型依赖注入报错:无法创建接口实例,求技术支持
解决Autofac泛型注入时的System.MissingMethodException问题
这个问题我之前也碰到过,核心原因是你继承的Application<T>无参构造函数里尝试直接实例化泛型参数T——而这里的T是IClassB<OtherA, OtherB>,一个接口,接口本身是不能被new出来的,这就是触发System.MissingMethodException的根源。
解决方案步骤
1. 重构基类构造函数(推荐方案)
把Application<T>中直接实例化T的逻辑改成依赖注入的方式,让Autofac帮你管理T的实例:
// 修改Application基类,替换无参构造为带注入参数的构造函数 public abstract class Application<T> { protected readonly T _innerService; public Application(T innerService) { _innerService = innerService; } }
然后更新ClassA<T>的构造函数,将依赖传递给基类:
public class ClassA<T> : Application<T>, IClassA<T> { // 接收T类型的依赖并传递给基类 public ClassA(T innerService) : base(innerService) { } }
2. 验证Autofac注册
你的现有注册代码是正确的,Autofac会自动处理泛型类型的解析:
builder.RegisterGeneric(typeof(ClassA<>)).As(typeof(IClassA<>)).InstancePerLifetimeScope(); builder.RegisterGeneric(typeof(ClassB<,>)).As(typeof(IClassB<,>)).InstancePerLifetimeScope();
当控制器需要IClassA<IClassB<OtherA, OtherB>>时,Autofac会:
- 先解析出
IClassB<OtherA, OtherB>对应的具体实现ClassB<OtherA, OtherB>实例 - 把这个实例注入到
ClassA<IClassB<OtherA, OtherB>>的构造函数中 - 最终将
ClassA实例注入到控制器里
3. 无法修改基类的备选方案
如果因为项目限制无法修改Application<T>的构造函数,可以在Autofac注册时手动指定构造参数:
builder.RegisterGeneric(typeof(ClassA<>)) .As(typeof(IClassA<>)) .InstancePerLifetimeScope() .WithParameter( (parameter, context) => parameter.ParameterType.IsGenericType && parameter.ParameterType.GetGenericTypeDefinition() == typeof(IClassB<,>), (parameter, context) => context.Resolve(parameter.ParameterType) );
不过这种方式不够优雅,还是优先推荐重构基类的依赖注入逻辑。
内容的提问来源于stack exchange,提问作者Sef Rio
相关产品推荐
相关产品推荐

