gpt4 book ai didi

dependency-injection - 将 UserManager 传递给 ConfigureServices MVC 6 中的 AuthorizationHandler

转载 作者:行者123 更新时间:2023-12-05 00:20:31 27 4
gpt4 key购买 nike

给定以下带有 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com