从 asp.core 2.2 迁移到 3.1。 Autofac.Core.DependencyResolutionException

Posted

技术标签:

【中文标题】从 asp.core 2.2 迁移到 3.1。 Autofac.Core.DependencyResolutionException【英文标题】:migration from asp.core 2.2 to 3.1. Autofac.Core.DependencyResolutionException 【发布时间】:2020-06-18 06:48:56 【问题描述】:

我正在进行迁移并遇到异常。 Autofac 可以从服务提供者的实例解析我的服务,但在请求时无法在我的控制器中获取它。

例外: Castle.DynamicProxy.ProxyGe nerationException:这是 DynamicProxy2 错误:代理的目标类型实现 Castle.DynamicProxy.IP roxyTargetAccessor 这是一个 DynamicProxy 基础设施接口,你永远不应该自己实现它 F。您是否尝试代理现有代理?

我的 AutoregistrableModule 看起来像这样:

public class AutoregisterableModule : Autofac.Module

    private readonly string _nameFilter;

    /// <summary>
    /// Default ctor
    /// </summary>
    /// <param name="nameFilter">Load will only search assemblies with names that contains filter</param>
    public AutoregisterableModule(string nameFilter)
    
        _nameFilter = nameFilter;
    

    /// <summary>
    /// Register's dependencies
    /// </summary>
    protected override void Load(ContainerBuilder builder)
    
        var assemblies = new List<Assembly>();
        var dependencies = DependencyContext.Default.RuntimeLibraries.Where(x => x.Name.Contains(_nameFilter));
        foreach (var library in dependencies)
        
            var assembly = Assembly.Load(new AssemblyName(library.Name));
            assemblies.Add(assembly);
        

        builder.Register(c => new LogInterceptor()).InstancePerLifetimeScope();

        var isProd = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production";

        var containerBuilder = builder.RegisterAssemblyTypes(assemblies.ToArray())
            .Where(TypesToRegisterFilter)
            .PreserveExistingDefaults()
            .AsImplementedInterfaces();

        if (!isProd)
        
            containerBuilder.EnableInterfaceInterceptors();
        

        base.Load(builder);
    

    private static bool TypesToRegisterFilter(Type type)
    
        return !type.IsSubclassOf(typeof(SwaggerConfigureOptions)) && !typeof(BackgroundService).IsAssignableFrom(type);
    

如果我删除该行一切正常(除了我的 LoggerInterceptor :D)

containerBuilder.EnableInterfaceInterceptors();

我的服务看起来像

 [Intercept(typeof(LogInterceptor))]
public class CategoriesService : ICategoriesService

     // some code here 

我尝试按照there 的建议将 Autofac.Extensions.DependencyInjection 包从 6.0.0 降级到 5.0.1 来修复它,但没有帮助。

你可以在那里找到完整的 Stacktrace https://pastebin.com/YCAhLQv0。

所以问题是如何修复异常并保持拦截器正常工作?

【问题讨论】:

您应该在此处包含您的依赖项列表。听起来您可能有一些不正常的地方,但这里没有足够的信息。 【参考方案1】:

通过将 Autofac.Extras.DynamicProxy 软件包版本从 4.5.0 提高到 5.0.0 来修复。 希望它可以帮助某人。

【讨论】:

以上是关于从 asp.core 2.2 迁移到 3.1。 Autofac.Core.DependencyResolutionException的主要内容,如果未能解决你的问题,请参考以下文章

从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行

从 .NET Core 2.2 迁移到 3.1 后,EF Core 随机抓取 API 请求上的用户表

Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序

如何使用 dotnet cli 命令以 VB.NET 语言创建 ASP.NET Core 项目?

将 Asp.Net Core 2.2 App 迁移到 3.1 时的整数序列化 [关闭]

迁移到 .NET Core 3.1 - 缺少 Newtonsoft