You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:07:37