Я пытаюсь реализовать собственный UserStore для своих моделей идентификации; однако я получаю эту ошибку времени выполнения при запуске приложения:
InvalidOperationException: Unable to resolve service for type '[Project].Models.Identity.ApplicationUserStore' while attempting to activate '[Project].Models.Identity.ApplicationUserManager'.
Куча:
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, bool throwIfCallSiteNotFound) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType, Type implementationType, CallSiteChain callSiteChain) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, CallSiteChain callSiteChain) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(Type serviceType, CallSiteChain callSiteChain) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor(Type serviceType) System.Collections.Concurrent.ConcurrentDictionary.GetOrAdd(TKey key, Func valueFactory) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) Microsoft.AspNetCore.Identity.IdentityBuilder+<>c__DisplayClass22_0.b__0(IServiceProvider services) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSite(IServiceCallSite callSite, TArgument argument) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSite(IServiceCallSite callSite, TArgument argument) Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine+<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired) lambda_method(Closure , IServiceProvider , object[] ) Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider+<>c__DisplayClass4_0.b__0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider+<>c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Моя реализация UserStore:
public class ApplicationUserStore : IUserStore<Employee>,
IUserClaimStore<Employee>,
IUserLoginStore<Employee>,
IUserRoleStore<Employee>,
IUserPasswordStore<Employee>,
IUserSecurityStampStore<Employee>
{
#region Constructor signatures I tried for dependency injection
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null)
{
}
public ApplicationUserStore(ApplicationDbContext context)
{
}
public ApplicationUserStore()
{
}
public ApplicationUserStore(DbContext context)
{
}
#endregion
...
Моя реализация UserManager:
public class ApplicationUserManager : UserManager<Employee>
{
public ApplicationUserManager(ApplicationUserStore store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<Employee> passwordHasher, IEnumerable<IUserValidator<Employee>> userValidators, IEnumerable<IPasswordValidator<Employee>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<Employee>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
}
Моя реализация SignInManager:
public class ApplicationSignInManager : SignInManager<Employee>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<Employee> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<Employee>> logger, IAuthenticationSchemeProvider schemes)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
}
И в Startup.ConfigureServices:
...
services.AddIdentityCore<Employee>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddUserStore<ApplicationUserStore>()
.AddUserManager<ApplicationUserManager>()
.AddSignInManager<ApplicationSignInManager>()
.AddDefaultTokenProviders();
services.AddTransient<IUserStore<Employee>, ApplicationUserStore>();
...
Мне нужно знать, что вызывает проблему, как ее решить и есть ли где-нибудь документация по сигнатурам активатора внедрения зависимостей Asp.Net Core 2.1.
@hugo. К сожалению, использование AddTransient без AddUserStore у меня не помогло, как и использование AddUserStore без AddTransient; Я получаю одно и то же сообщение.
Вы зарегистрировали ApplicationDbContext?
@Brad. Я предполагаю, что это регистрируется этой линией .AddEntityFrameworkStores<ApplicationDbContext>().
Это не так. Эта строка просто сообщает Identity, какой тип IdentityDbContext следует использовать. Ожидается, что он будет предварительно настроен и зарегистрирован, например. services.AddDbContext<ApplicationDbContext>();. У вас могут быть аналогичные проблемы с другими вашими пользовательскими услугами.
@Brad. Это было действительно близко; вместо этого пришлось прописать UserStore через AddScoped - решение придумал я; если интересно, посмотрите ответ.
Голосующий против, вы бы сказали, почему?





Изучив реализацию с открытым исходным кодом здесь и здесь, я пришел к разгадке, в чем могла быть проблема, и угадали правильно. UserStore нужно было зарегистрировать через эту строку в Startup.ConfigureServices:
services.AddScoped<ApplicationUserStore>();
Итак, мой последний подход был:
...
services.AddIdentityCore<Employee>()
.AddUserManager<ApplicationUserManager>()
.AddSignInManager<ApplicationSignInManager>()
.AddDefaultTokenProviders();
services.AddScoped<IUserStore<Employee>, ApplicationUserStore>();
services.AddScoped<ApplicationUserStore>();
...
Хотя он работал без:
services.AddScoped<IUserStore<Employee>, ApplicationUserStore>();
Спасибо! У меня была аналогичная проблема с инъекцией зависимостей DbContext. (Microsoft.Extensions.DependencyInjection.ActivatorUtilities .GetService), и проблема была решена путем ввода другого элемента services.AddDbContext в файл Startup.cs.
У меня такая же проблема. Что такое ApplicationUserStrore? Мне не удалось найти ApplicationUserStore по предоставленным ссылкам
@ T3.0 ApplicationUserStore, как указано в вопросе, является настраиваемым IUserStore для моего настраиваемого типа пользователя.
Спасибо. Я добавил свойство isEnabled к своему пользовательскому типу пользователя и не создавал пользовательское хранилище пользователей. Возможно, в этом причина моей ошибки. Unable to resolve service for type Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore 1[Myapp.Areas.Identity.Data.xyzUser] while attempting to activate Myapp.Areas.Identity.Pages.Account.Manage.CustomUserEditPage.////// at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method...
спасибо за это, это действительно вытащило меня из инъекции зависимости h * ll!
если вы объявляете services.AddTransient <IUserStore <Employee>, ApplicationUserStore> (), вы не можете использовать ApplicationUserStore в своих конструкторах. Вам нужно использовать IUserStore <Employee>