Autofac核心相依性解析例外

问题描述 投票:0回答:1

我想将这些依赖注入与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\

也如何将这段代码转换为autofac?

services.AddScoped<IPrincipal>(provider =>
                provider.GetRequiredService<IHttpContextAccessor>()?.HttpContext?.User ?? ClaimsPrincipal.Current);
c# .net-core dependency-injection autofac
1个回答
0
投票

[似乎您正在使用InstancePerRequest,而不是InstancePerLifetimeScope。这是one of the documented differences between ASP.NET classic and ASP.NET Core

使用InstancePerLifetimeScope而不是InstancePerRequest。在以前的ASP.NET集成中,您可以将依赖项注册为InstancePerRequest,这将确保每个HTTP请求仅创建一个依赖项实例。这是因为Autofac负责setting up the per-request lifetime scope。随着Microsoft.Extensions.DependencyInjection的引入,每个请求和其他子生存期范围的创建现在已成为框架提供的conforming container的一部分,因此所有子生存期范围都得到同等对待-不再有特殊的“请求级别范围” 。而不是注册您的依赖项InstancePerRequest,请使用InstancePerLifetimeScope,您应该获得相同的行为。请注意,如果要在Web请求期间创建您自己的生命周期作用域,则会在这些子作用域中获得一个新实例。

© www.soinside.com 2019 - 2024. All rights reserved.