给出以下用于UserManager的DI类
public class AccountAuthorizationHandler : AuthorizationHandler
{
private readonly UserManager userManager;
public AccountAuthorizationHandler(UserManager userManager)
{
this.userManager = userManager;
}
protected override void Handle(AuthorizationContext context,
OperationAuthorizationRequirement requirement,
AuthorisedAccount resource)
{
// Pull the user ID claim out from the context.User
var userId = context.User.GetUserId();
// Get the current user's account numbers.
var user = userManager.Users
.Include(u => u.AuthorisedAccounts)
.Where(u => u.Id == userId)
.FirstOrDefault();
//Now check if the user's account numbers match the resource accountNumber, and
foreach( var authorizedAccount in user.AuthorisedAccounts)
{
if ((resource.AccountNo == authorizedAccount.AccountNo) &&
(requirement == Operations.Read))
context.Succeed(requirement);
}
}
}
我想实例化它,ConfigureServices
但看起来我需要提供Usermanager.即责任似乎回到了来电者身上.
services.AddInstance
(new AccountAuthorizationHandler(I want to add UserManager here));
我想我认为AuthorizationHandler会解决Dependency本身
我该怎么做呢
谢谢
您正在使用错误的重载.
尝试这样的事情:
services.AddTransient();
在依赖注入中,有许多不同的概念,你使用的是等效的单例.
使用ASP.NET依赖注入声明单例有两种方法.
您可以自己提供实例,services.AddInstance
也可以让系统为您构建实例并控制其生命周期,以便构建此单个实例.
这样做是这样的:
services.AddSingleton()
每次请求此类型的依赖项时,它将new
再次启动该对象.没有两个实例是平等的,因为它们将始终被重新创建.
services.AddTransient()
那时,我们要求每个请求一个对象.它是Transient和Singleton的混合,但我们只new
按每个HTTP请求访问该对象一次.
services.AddScoped()
从一开始就将依赖注入内置到框架中.从安全性到模型绑定的所有东西都可以通过正确的界面和正确的生命周期来重载.
你应该花一点时间,在过快之前刷新你对依赖注入的知识.如果时间不够,请使用此帖子中提供的信息.这将是不够好,让你开始.