Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在静态类中调用服务?_C#_Asp.net Core - Fatal编程技术网

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。它将创建内存泄漏和/或可怕的
对象已被释放
消息,因为即使在请求结束后,引用仍将保留