Asp.Net Core 2.1 Identity - внедрение зависимости UserStore

Я пытаюсь реализовать собственный 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.

если вы объявляете services.AddTransient <IUserStore <Employee>, ApplicationUserStore> (), вы не можете использовать ApplicationUserStore в своих конструкторах. Вам нужно использовать IUserStore <Employee>

hugo 13.06.2018 22:03

@hugo. К сожалению, использование AddTransient без AddUserStore у меня не помогло, как и использование AddUserStore без AddTransient; Я получаю одно и то же сообщение.

Aly Elhaddad 14.06.2018 01:38

Вы зарегистрировали ApplicationDbContext?

Brad 14.06.2018 01:50

@Brad. Я предполагаю, что это регистрируется этой линией .AddEntityFrameworkStores<ApplicationDbContext>().

Aly Elhaddad 14.06.2018 02:04

Это не так. Эта строка просто сообщает Identity, какой тип IdentityDbContext следует использовать. Ожидается, что он будет предварительно настроен и зарегистрирован, например. services.AddDbContext<ApplicationDbContext>();. У вас могут быть аналогичные проблемы с другими вашими пользовательскими услугами.

Brad 14.06.2018 02:10

@Brad. Это было действительно близко; вместо этого пришлось прописать UserStore через AddScoped - решение придумал я; если интересно, посмотрите ответ.

Aly Elhaddad 14.06.2018 02:15

Голосующий против, вы бы сказали, почему?

Aly Elhaddad 14.06.2018 05:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
5 626
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изучив реализацию с открытым исходным кодом здесь и здесь, я пришел к разгадке, в чем могла быть проблема, и угадали правильно. 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.

Taraz 18.06.2018 22:12

У меня такая же проблема. Что такое ApplicationUserStrore? Мне не удалось найти ApplicationUserStore по предоставленным ссылкам

T3.0 17.04.2019 15:35

@ T3.0 ApplicationUserStore, как указано в вопросе, является настраиваемым IUserStore для моего настраиваемого типа пользователя.

Aly Elhaddad 17.04.2019 15:46

Спасибо. Я добавил свойство 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(IServiceP‌​rovider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method...

T3.0 17.04.2019 16:32

спасибо за это, это действительно вытащило меня из инъекции зависимости h * ll!

mike gold 22.05.2020 01:29

Другие вопросы по теме