Невозможно подключить перехватчик на классах / интерфейсах в приложении asp. net core 3.1 - PullRequest
0 голосов
/ 05 февраля 2020

Пакеты: Autofa c .Extensions.DependencyInjection (6.0.0), Autofa c .extras.DynamicProxy (4.5.0)

Я пытаюсь создать прототип перехватчика для всех наших служб классы / интерфейс, обслуживающие контроллеры Web API в нашем приложении, следуя ASP. NET Core 4.0 и документации Interceptor. Interceptor - это просто простое действие Log с использованием Serlog:

    public MethodCallInterceptor()
    {
    }

    public void Intercept(IInvocation invocation)
    {
        var text = invocation.Method.Name;
        Log.Logger.Debug($"Interceptor (Method): {text}");

        invocation.Proceed();
    }

Наше основное приложение настраивает Autofa c с ComApiApplication в качестве класса «Автозагрузка»:

    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<ComsApiApplication>());
    }

В ComsApiApplication, Я регистрирую большинство служб ASP. NET MVC в ConfigureServices (например, Аутентификация, Авторизация и т. Д. c). Затем я подключаю Interceptor для классов в паре наших сервисных сборок в его функции ConfigureContainer:

    public void ConfigureContainer(ContainerBuilder builder)
    {
        foreach (var assembly in Options.Assemblies)
        {
            // Add application services: IService => Service.
            var registrations = assembly.GetExportedTypes()
                .Where(type => type.Namespace != null && type.Namespace.Contains(".Services") && type.GetInterfaces().Any() && !type.IsAbstract)
                .Select(type => new
                {
                    Service = type.GetInterfaces().Single(inf => inf.Name.Contains(type.Name)),
                    Implementation = type
                });

            foreach (var registration in registrations)
            {
               //builder.RegisterType(registration.Implementation).As(registration.Service).InstancePerDependency().EnableInterfaceInterceptors().InterceptedBy(typeof(MethodCallInterceptor));
                    builder.RegisterType(registration.Implementation).As(registration.Service).EnableInterfaceInterceptors().InstancePerDependency().InterceptedBy(typeof(MethodCallInterceptor));
            }
            builder.Register(c => new MethodCallInterceptor());
        }
    }

Однако, когда я запускаю приложение с запросами, ведущими к вызову функций интерфейса в этих сервисах (наследование существует в наших интерфейсах и классах обслуживания), я получаю следующее исключение и буду благодарен за любую помощь в определении моей проблемы:

Autofa c .Core.DependencyResolutionException: исключение было выдано при выполнении операции разрешения , Смотрите InnerException для подробностей. ---> Castle.DynamicProxy.ProxyGenerationException: это ошибка DynamicProxy2: тип цели для прокси реализует Castle.DynamicProxy.IProxyTargetAccessor, который является интерфейсом инфраструктуры DynamicProxy, и вы никогда не должны реализовывать его самостоятельно. Вы пытаетесь прокси существующего прокси? в Castle.DynamicProxy.Generators.BaseProxyGenerator. .InterfaceProxyWithTargetGenerator.GenerateCode (тип proxyTargetType, тип [] интерфейсы, опция ProxyGenerationOptions) при Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithTarget (тип interfaceToProxy, типа [] additionalInterfacesToProxy, типа TargetType, варианты ProxyGenerationOptions) в Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget (тип interfaceToProxy , Тип [] AdditionalInterfacesToProxy, Тип targetType, Параметры ProxyGenerationOptions) в Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget (Тип interfaceToProxy, Тип [] AdditionalInterfacesToProxy, Объектная цель, Параметры ProxyGenerationOptions, IInte rceptor [] перехватчики) в Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget (Тип interfaceToProxy, Тип [] extraInterfacesToProxy, объектная цель, перехватчики IInterceptor []) в Autofa c .Extras.DynamicProxy.RegistrationEx9_0 1010_c0 <101>. ) в Autofa c .Core.Registration.ComponentRegistration.RaiseActivating (контекст IComponentContext, IEnumerable 1 parameters, Object& instance) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1 параметры, Object & decoratorTarget) в Autofa c .Core.Resolving.InstanceLookup.Execute () в Autofa c. .Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifetimeScope currentOperationScope, запрос ResolveRequest) в Autofa c .Core.Resolving.ResolveOperation.ResolveComponent (запрос ResolveRequest) в запросе Autofa c ResolveRecol. Конец внутренней трассировки стека исключений --- в Autofa c .Core.Resolving.ResolveOperation.Execute (запрос ResolveRequest) в Autofa c .Core.Lifetime.LifetimeScope.ResolveComponent (ResolveReques t запрос) в Autofa c .ResolutionExtensions.TryResolveService (контекст IComponentContext, служба Service, параметры IEnumerable 1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable 1) в Autofa c .ResolutionExtensions.ResolveOptional (контекст IComponentContext, тип serviceType, параметры IEnumerable at1) 1040 * .ResolutionExtensions.ResolveOptional (контекст IComponentContext, тип serviceType) в Autofa c .Extensions.DependencyInjection. AutofacServiceProvider.GetService (Тип serviceType) в Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, Тип типа, Тип requiredBy, Логический isDefaultParameterRequired) в lambda_method * Microsoft. Controllers.ControllerActivatorProvider. <> C__DisplayClass4_0.b__0 (ControllerContext controllerContext) в Microsoft.AspNetCore. Mvc .Controllers.ControllerFactoryProvider. <> C__DisplayClass5_0.g__CreateControlxtInInA .Conf. Далее (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsyn c () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 25_0 (ResourceInvoker invoker, Task LastTask, State next, Sco область видимости, состояние объекта, логическое значение isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.SystemTextJsonResultExecutor: Информация: выполнение JsonResult, запись значения типа «System.String».

1 Ответ

1 голос
/ 05 февраля 2020

Следующее от Google Translate: По совпадению, я только что решил эту проблему, но это не правильное решение. Просто нужно понизить пакет Autofa c .Extensions.DependencyInjection до 5.0.1 , чтобы решить проблему.

...