миграция с asp .core 2.2 на 3.1. Autofa c .Core.DependencyResolutionException - PullRequest
0 голосов
/ 05 марта 2020

Я выполняю миграцию и обнаружил исключение. Autofa c может разрешить мой сервис из экземпляра поставщика услуг, но не может получить его в моем контроллере во время запроса.

Исключение: 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 
}

Я попытался исправить это путем понижения версии пакета Autofa c .Extensions.DependencyInjection с 6.0.0 до 5.0.1, как было предложено там но это не помогло.

Вы можете найти полную Stacktrace там https://pastebin.com/YCAhLQv0.

Так что вопрос в том, как я могу исправить исключение и мой перехватчик работает?

1 Ответ

0 голосов
/ 06 марта 2020

Исправлено путем повышения версии пакета Autofa c .Extras.DynamicProxy с 4.5.0 до 5.0.0. Надеюсь, это может кому-то помочь.

...