我正在尝试在LoginController中调用登录函数。我正在使用Identity Framework,但是在解决依赖项时遇到了问题。
我尝试将默认接口扩展到我自己的类,并且我刚刚尝试使用默认值。我认为我对注入依赖项时发生的事情没有正确的了解。
IdentityUserManager是我的客户用户管理器,它扩展了默认的身份用户管理器。 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;
}
从我的startup.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 ---
答案 0 :(得分:1)
您将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>();
//...
因此可以直接注入。