gpt4 book ai didi

c# - 我如何用扩展方法注入(inject)一个类? ASP.NET 标识

转载 作者:行者123 更新时间:2023-11-30 18:27:23 25 4
gpt4 key购买 nike

我尝试在我的 Controller 中注入(inject)来自 ASP.NET Identity 的 ApplicationUserManager。这是我尝试注入(inject)的类(class):

public class ApplicationUserManager : UserManager<ApplicationUser>, IApplicationUserManager
{ ... }

这就是我尝试注入(inject) Controller 的方式:

        private readonly IApplicationUserManager _userManager;

public MyController(IApplicationUserManager userManager)
{
_userManager = userManager;
}

问题是当我尝试从 _userManager 获取方法时,当我编写 _userManager. 时,intellisense 只给我 Async 方法。例如 _userManager.RemoveFromRoleAsync() 而不是 _userManager.RemoveFromRole()。发生这种情况是因为我的界面只有异步方法。但是 Sync 方法(非异步) 是 UserManager 的扩展方法。

public static class UserManagerExtensions
{ ...
public static IdentityResult RemoveFromRole<TUser, TKey>(this UserManager<TUser, TKey> manager, TKey userId,
string role)
where TKey : IEquatable<TKey>
where TUser : class, IUser<TKey>
{
if (manager == null)
{
throw new ArgumentNullException("manager");
}
return AsyncHelper.RunSync(() => manager.RemoveFromRoleAsync(userId, role));
}
...}

UserManager 也派生自另一个类:

public class UserManager<TUser> : UserManager<TUser, string> where TUser : class, IUser<string>
{
...
}

问题是:如何在我的 Controller 中获取同步方法???

最佳答案

由于扩展方法适用于类定义而不是接口(interface),因此您还需要首先将 IApplicationUserManager 和 IApplicationUserManager 强制转换为 UserManager。不幸的是,从 DI 和模拟的角度来看,这不是很好的做法。为了说明这一点,这应该有效......

if (IApplicationUserManager is UserManager)
{
UserManager userManager = (UserManager)IApplicationUserManager ;
userManager.RemoveFromRole(...)
}

但我不推荐这样做,因为 Controller 不应该了解实现,这就是您的问题所在。事实上,扩展方法本质上是仅在类实现上定义的,接口(interface)不知道它。

因此,将扩展方法功能放在接口(interface)上声明的方法中实际上可能更好。

关于c# - 我如何用扩展方法注入(inject)一个类? ASP.NET 标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775315/

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