Autofa c Исключение разрешения основных зависимостей - PullRequest
1 голос
/ 17 января 2020

Я хочу сравнить эти инъекции зависимостей с autofac https://github.com/MHKarami97/AspNetCoreWebApi/blob/master/WebFramework/Configuration/Identity/AddCustomServicesExtensions.cs

с этим: https://github.com/MHKarami97/AspNetCoreWebApi/blob/master/WebFramework/Configuration/AutofacConfigurationExtensions.cs

, но я получаю ошибку в запустите программу:

An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = PolicyEvaluator (ReflectionActivator), Services = [Microsoft.AspNetCore.Authorization.Policy.IPolicyEvaluator], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope --->
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = DefaultAuthorizationService (ReflectionActivator), Services = [Microsoft.AspNetCore.Authorization.IAuthorizationService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope ---> 
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = DefaultAuthorizationHandlerProvider (ReflectionActivator), Services = [Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope ---> 
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IAuthorizationHandler[] (DelegateActivator), Services = [System.Collections.Generic.IEnumerable`1[[Microsoft.AspNetCore.Authorization.IAuthorizationHandler, Microsoft.AspNetCore.Authorization, Version=3.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]]], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = ExternallyOwned ---> 
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = DynamicPermissionsAuthorizationHandler (ReflectionActivator), Services = [Microsoft.AspNetCore.Authorization.IAuthorizationHandler], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> 
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = SecurityTrimmingService (ReflectionActivator), Services = [Services.Contracts.Identity.ISecurityTrimmingService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> 
An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = MvcActionsDiscoveryService (ReflectionActivator), Services = [DNTCommon.Web.Core.IMvcActionsDiscoveryService], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> 
An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.AspNetCore.Mvc.Infrastructure.IActionDescriptorCollectionProvider)' on type 'MvcActionsDiscoveryService'. ---> Multiple custom attributes of the same type found. (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.)\",\"StackTrace\":\"   
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)\\r\\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\\r\\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\\r\\n   at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\\r\\n   
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)\\r\\n   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\\r\\n   
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)\\r\\n   
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)\\r\\n   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)\\r\\n   
at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType)\\r\\n   at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType)\\r\\n   
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)\\r\\n   
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)\\r\\n   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)\\r\\n   
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)\\r\\n   at OwaspHeaders.Core.SecureHeadersMiddleware.Invoke(HttpContext httpContext)\\r\\n   
at Swashbuckle.AspNetCore.ReDoc.ReDocMiddleware.Invoke(HttpContext httpContext)\\r\\n   
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)\\r\\n   
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)\\r\\n   
at WebFramework.Middlewares.CustomExceptionHandlerMiddleware.Invoke(HttpContext context) in F:\\\\Project\\\\Best\\\\AspNetCoreWebApi\\\\WebFramework\\\\Middlewares\\\\CustomExceptionHandlerMiddleware.cs:line 50\

также, как я могу преобразовать этот код в autofa c?

services.AddScoped<IPrincipal>(provider =>
                provider.GetRequiredService<IHttpContextAccessor>()?.HttpContext?.User ?? ClaimsPrincipal.Current);

1 Ответ

0 голосов
/ 18 января 2020

Похоже, вы используете InstancePerRequest вместо InstancePerLifetimeScope. Это одно из документированных различий между ASP. NET classi c и ASP. NET Core :

Вместо этого используйте InstancePerLifetimeScope of InstancePerRequest. В предыдущей интеграции ASP. NET вы могли зарегистрировать зависимость как InstancePerRequest, что обеспечило бы создание только одного экземпляра зависимости для HTTP-запроса. Это сработало, потому что Autofa c отвечал за настройку области действия для каждого запроса . С введением Microsoft.Extensions.DependencyInjection создание индивидуальных запросов и других дочерних областей действия теперь стало частью соответствующего контейнера , предоставляемого платформой, поэтому все дочерние области действия обрабатываются одинаково - никаких особых « область запроса уровня »больше. Вместо регистрации ваших зависимостей InstancePerRequest используйте InstancePerLifetimeScope, и вы должны получить то же поведение. Обратите внимание, что если вы создаете свои собственные области действия времени жизни во время веб-запросов, вы получите новый экземпляр в этих дочерних областях.

...