- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在我的 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/
我是一名优秀的程序员,十分优秀!