公共静态类和构造函数

时间:2019-11-10 21:09:33

标签: c#

我正面临着这个奇怪的问题,似乎没有所谓的监工。知道为什么吗?

public class CommandeController : Controller
{
  public ActionResult Index()
  {
    return View("Index", MyModel);
  }

  public PartialViewResult FirstViewAction(MyModel model)
  {
    ............
    return PartialView("FirstView", FirstModel);
  }

  public PartialViewResult SecondViewAction()
  {
     ...........
     return PartialView("SecondView", SecondModel);
  }
}

来自另一个普通班级:

public static class GetClaims
    {
        public static string tenantid { get; set; }
        public static string username { get; set; }
        public static bool isauthenticated { get; set; }

        static GetClaims()
        {
            ClaimsPrincipal incomingPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
            if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true)
            {
                ClaimsIdentity claimsIdentity = incomingPrincipal.Identity as ClaimsIdentity;
                username = claimsIdentity.Name;
                isauthenticated = claimsIdentity.IsAuthenticated;
                if (claimsIdentity.IsAuthenticated == true)
                {
                    tenantid = incomingPrincipal.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
                }
                else
                {
                    tenantid = "bla";
                }

            }
        }
    }

2 个答案:

答案 0 :(得分:0)

确实没有充分的理由以此处的方式编写此特定示例。

有一个例子,如果您读过static constructors,将会看到在应用程序的整个生命周期中,静态构造函数只被调用一次。

因此,您的代码将对第一个触发静态构造函数的用户有效。

即使这还不足以解决问题,您仍然有一个问题,那就是任何人都可以设置您创建的静态属性,因此无法确保这些属性确实来自数据库。

如果您真的想将其保留为静态方法,请为其提供返回类型并以int作为输入

ClaimsPrincipal

然后您可以在查询部分中使用,例如使用

public static class ClaimsManager
{
    public static UserIdentityState GetClaims( ClaimsPrincipal principal )
    {
        if (principal == null || !principal.Identity.IsAuthenticated)
        {
            return UserIdentityState.NotAuthenticated;
        }
        return new UserIdentityState {
            Name =  principal.Identity.Name,
            TenantId = incomingPrincipal.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid")?.Value,
            IsAuthenticated = true
        };
    }
}

当然,您仍然必须具有我要提出的// at the using statements using static ClaimsManager; //... in your query statement var claims = GetClaims( Thread.CurrentPrincipal as ClaimsPrincipal ); if (!claims.IsAuthenticated) { return; } query = $"UPDATE [DB].[dbo].[CustomerData-{claims.TenantId}] SET .... "; 类的实现,以及该类的返回UserIdentityState用户的静态方法

答案 1 :(得分:0)

我看来您的课程似乎不是静态的。我认为应该更像以下代码段。

public class GetClaims
{
    public string Tenantid { get; }
    public string Username { get; }
    public bool Isauthenticated { get; }


    GetClaims()
    { 
       ...
    }
}

静态构造函数

在通常情况下,

Static constructors仅被调用一次。

public class C {
    static C() { Console.WriteLine("Static!");} 
    public C() { Console.WriteLine("Instance!");}
}

class Program
{
    static void Main(string[] args)
    {
        var c1 = new C();
        var c2 = new C();
    }
Static!
Instance!
Instance!
相关问题