C# 如何在静态类中调用服务?
我正在制作一个扩展类来获取用户电子邮件,但我无法引用C# 如何在静态类中调用服务?,c#,asp.net-core,C#,Asp.net Core,我正在制作一个扩展类来获取用户电子邮件,但我无法引用ApplicationDbContext服务 public static class Extensions { // private static readonly ApplicationDbContext _dbContext; // static Extensions(ApplicationDbContext dbContext) // { // _dbContext = dbContext;
ApplicationDbContext
服务
public static class Extensions
{
// private static readonly ApplicationDbContext _dbContext;
// static Extensions(ApplicationDbContext dbContext)
// {
// _dbContext = dbContext;
// }
public static string GetUserEmail(this ClaimsPrincipal principal)
{
string email = string.Empty;
string userid = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? "";
if (!string.IsNullOrEmpty(userid))
{
email = _dbContext.Users.Single(x => x.Id == userid).Email;
}
return email;
}
}
用途:
string email = User.GetUserEmail();
但是静态类不能包含任何参数。另外,我不想将dbContext
作为参数传递给GetUserEmail
方法
还有其他方法吗?可以使用静态初始化方法吗
public class Extensions
{
private static ApplicationDbContext _dbContext { get; set; }
public static void Init(ApplicationDbContext dbContext)
{
this._dbContext = dbContext;
}
}
用法
Extensions.Init(dbContext);
var email = User.GetEmail();
使用usermanager获取该信息
// Inject UserManager<IdentityUser> into your controller or service
var user = await userManager.GetUserAsync(this.User); // pass ClaimsPrincipal
var email = await usermanager.GetEmailAsync(user);
//将UserManager注入控制器或服务
var user=await userManager.GetUserAsync(this.user);//传递请求权
var email=await usermanager.GetEmailAsync(用户);
我假设使用Identity已经有了一个用于该确切请求的类?您可以确保电子邮件声明位于ClaimsPrincipal
中,然后阅读that@mvermef抱歉,不需要提取请求。建议按照@Dr.Fre的建议执行……看起来不错。那么,你如何分配razor页面上的上下文?@foo你的问题没有提到razor任何地方。@Amy很抱歉错过了。但这就是为什么我不想使用上下文作为参数。无论如何,你不应该在Razor中使用它。在控制器中使用它,并将数据传递到Razor视图中。您的视图不应该了解dbcontext。使用静态字段存储dbcontext在很多级别上都是错误的:1。它超越了将DI放在首位的目的,2。它将创建内存泄漏和/或可怕的对象已被释放
消息,因为即使在请求结束后,引用仍将保留