Не удалось разрешить службу для типа IdentityUserManager при попытке активировать контроллер входа - PullRequest
2 голосов
/ 22 июня 2019

Я пытаюсь вызвать функцию входа в свой LoginController. Я использую Identity Framework, но у меня возникают проблемы с разрешением зависимостей.

Я пытался расширить интерфейсы по умолчанию для моих собственных классов, и я только что попытался использовать значения по умолчанию. Я не думаю, что у меня есть правильное понимание того, что происходит, когда вводятся зависимости.

IdentityUserManager - это мой пользовательский менеджер пользователей, который расширяет стандартный Identity User Manager. DataContext расширяет IdentityDBContext.

LoginController

   [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
    public class LoginController : Controller
    {
        #region Private Fields

        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly IdentityUserManager _identityUserManager;
        private readonly IDataContext _context;

        #endregion

        #region Constructors

        public LoginController(SignInManager<IdentityUser> signInManager, IdentityUserManager identityUserManager, IDataContext context)
        {
            this._signInManager = signInManager;
            this._identityUserManager = identityUserManager;
            this._context = context;
        }

Мой класс IdentityUserManager. Интерфейс IIdentityUserManager ничего не делает, кроме указания моих 3 пользовательских методов.

  public class IdentityUserManager : UserManager<IdentityUser>, IIdentityUserManager
    {
        private readonly IDataContext _context;
        private readonly ILDAPUserManager _ldapUserManager;
        private IUserStore<IdentityUser> _userStore;

        /// <summary>
        /// Constructor for Identity User Manager
        /// </summary>
        /// <param name="context">Data context</param>
        /// <param name="userStore">Provides abstraction for store that manages user accounts</param>
        /// <param name="identityOptions">Retrieves identity options</param>
        /// <param name="passwordHasher">Abstraction for hashing passwords</param>
        public IdentityUserManager(ILDAPUserManager ldapUserManager, IDataContext context, IUserStore<IdentityUser> userStore): base(userStore, null, null, null, null, null, null, null, null)
        {
            this._ldapUserManager = ldapUserManager;
            this._context = context;
            this._userStore = userStore;
        }

Из моего автозагрузки.cs

 services.AddIdentityCore<IdentityUser>(); // .AddEntityFrameworkStores<DataContext>();
            services.AddDbContext<IDataContext, DataContext>();
            services.AddScoped<ILDAPUserManager, LDAPUserManager>();
            services.AddScoped<UserManager<IdentityUser>, IdentityUserManager>();
            services.AddScoped<IUserStore<IdentityUser>, IdentityUserStore>();
            services.AddTransient<SignInManager<IdentityUser>>();
            services.AddTransient<IDbConfig, DataContextFactory>();

Это сообщение об ошибке, которое выдается

System.InvalidOperationException: Unable to resolve service for type 'CareInTime.Service.Controllers.IdentityUserManager' while attempting to activate 'CareInTime.Service.Controllers.LoginController'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

1 Ответ

1 голос
/ 22 июня 2019

Вы зарегистрировали IdentityUserManager как UserManager<IdentityUser>

 services.AddScoped<UserManager<IdentityUser>, IdentityUserManager>();

Это означает, что контейнер знает, как разрешить UserManager<IdentityUser> в IdentityUserManager

Конструктор контроллера

public LoginController(SignInManager<IdentityUser> signInManager, 
    IdentityUserManager identityUserManager, 
    IDataContext context
) { ...

явно запрашивает IdentityUserManager, но контейнер не знает, как разрешить этот тип на основе того, что было зарегистрировано при запуске.

Так что либо обновите конструктор, чтобы он ожидал того, что было зарегистрировано при запуске, либо добавьте IdentityUserManager в сервисный набор

//...

services.AddScoped<IdentityUserManager>();

//...

, поэтому его можно вводить напрямую.

...