给定以下带有 DI 的 UserManager 类
public class AccountAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, AuthorisedAccount>
{
private readonly UserManager<ApplicationUser> userManager;
public AccountAuthorizationHandler(UserManager<ApplicationUser> 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
中实例化它但看起来我需要提供用户管理器。即责任似乎回到了调用者身上。services.AddInstance<IAuthorizationHandler>
(new AccountAuthorizationHandler(I want to add UserManager here));
我想我认为 AuthorizationHandler 会神奇地解决依赖关系本身
我该怎么做
谢谢
最佳答案
tldr;
您使用了错误的重载。
尝试这样的事情:
services.AddTransient<IAuthorizationHandler, AccountAuthorizationHandler>();
在依赖注入(inject)中,有许多不同的概念,您使用的相当于单例。
关于依赖注入(inject)的更多细节
辛格尔顿
有两种方法可以使用 ASP.NET 依赖注入(inject)来声明单例。
要么您自己为实例提供
services.AddInstance<T>(...)
或者您让系统为您构建它并控制它的生命周期,以便构建这个单一实例。这样做是这样的:
services.AddSingleton<TInterface, TImplementation>()
transient 生命周期
每次请求这种类型的依赖时,它都会
new
再次抬起对象。没有两个实例是相等的,因为它们总是会被重新创建。services.AddTransient<TInterface, TImplementation>()
范围
那时,我们为每个请求请求一个对象。它是 Transient 和 Singleton 的混合体,但我们只会使用
new
每个 HTTP 请求的对象一次。services.AddScoped<TInterface, TImplementation>()
结论
依赖注入(inject)从一开始就内置在框架中。从安全性到模型绑定(bind)的一切都可以通过正确的接口(interface)和正确的生命周期来重载。
在过快之前,您应该花一点时间重新了解依赖注入(inject)的知识。如果没有足够的时间,请使用本文中提供的信息。这足以让你开始。
关于dependency-injection - 将 UserManager 传递给 ConfigureServices MVC 6 中的 AuthorizationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359075/