在c#中设置类来初始化公共变量的正确方法是什么?

c# web-services

25 观看

1回复

198 作者的声誉

我在c#的底部创建了这个类。webservices引用此类来确定用户访问,如下所示:

[WebMethod]
public List<FAFSA> getFAFSA(string pageID)
{
    formValues fv = new formValues();
    string personID = fv.personID;
    List<FAFSA> lf = new List<FAFSA>();

    if (fv.secBlur == "no_secBlur")
    {
        FAFSA f = new FAFSA();
        f.fafsaCheck = "0";
        lf.Add(f);
    }

    ...
}

我正在尝试添加两个变量fafsa和staff。方法getSecBlur()从我的数据库返回secBlur,fafsa和staff的所有三个值。那么我该如何设置这个类,以便只调用一次SecBlur方法,但是填充所有三个变量,以便它们可以在webservice调用中使用?它不会像现在这样工作,因为它说fafsa和工作人员需要是静态的,但是如果我将它们设置为静态,那么在webservices中它表示必须使用实例引用来访问成员。

对不起,如果措辞不好,但我是新手,仍在努力学习......

public class formValues : System.Web.Services.WebService
{
    public string userName = getUserName();
    public string firstName = getFirstName();
    public string personID = getPersonID();
    public int fafsa = 0;
    public int staff = 0;
    public string secBlur = getSecBlur();

    private static string getUserDataString(int ix)
    {
        string retValue = "";

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (authCookie != null)
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);

                if (ticket != null)
                {
                    string[] userData = { "" };

                    char[] delimiterChar = { '|' };
                    userData = ticket.UserData.Split(delimiterChar);
                    if (userData.Length > 1)
                        retValue = userData[ix];
                    else
                    {
                        FormsAuthentication.SignOut(); 

                        string redirUrl = "/DMC/loginNotFound.html";
                        HttpContext.Current.Response.Redirect(redirUrl, false);
                    }
                }
            }
        }

        return retValue;
    }

    private static string getUserName()
    {
        //This retrieves the person logged into windows/active directory
        WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        //string[] fullUsername = wp.Identity.Name.Split('\\');
        string fullUsername = wp.Identity.Name;

        return fullUsername;
    }

    private static string getFirstName()
    {
        string firstName = getUserDataString(1);

        return firstName;
    }

    private static string getPersonID()
    {
        string personID = getUserDataString(0);

        return personID;
    }

    private static string getSecBlur()
    {
        string secBlur = "no_secBlur";

        string mySQL = "exec get_UserAdminStatus @personID";
        string cf = System.Configuration.ConfigurationManager.ConnectionStrings["DistrictAssessmentDWConnectionString"].ConnectionString;

        SqlConnection connection = new SqlConnection(cf);
        SqlCommand command = new SqlCommand(mySQL, connection);

        command.Parameters.AddWithValue("@personID", getUserDataString(0));

        connection.Open();

        SqlDataReader dr = command.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(dr);
        connection.Close();

        if (dt.Rows.Count > 0)
        {
            if (dt.Rows[0]["secBlur"].ToString() == "1")
                secBlur = "secBlur";

            fafsa = Convert.ToInt32(dt.Rows[0]["fafsa"]);
            staff = Convert.ToInt32(dt.Rows[0]["staff"]);
        }

        return secBlur;
    }
}
作者: Jimmy Genslinger 的来源 发布者: 2018 年 10 月 18 日

回应 1


-1

3962 作者的声誉

决定

如果你给任何类静态,公共值所谓的“静态”(或类型)将在任何访问完成之前调用构造函数来执行初始化工作:https//docs.microsoft.com/en-us/dotnet/ CSHARP /编程引导/班,和结构/静态构造函数

执行initlizsation或定义默认值的另一种常用方法是使用Factory Pattern。如果您在X-Box或PC上运行,XNA中的图形类必须适应,因此它使用工厂模式。

与Web(任何东西)相关的coruse存在变量Scope的整个问题,即使对于Statics也是如此。更少的局部变量。

作者: Christopher 发布者: 2018 年 10 月 18 日
32x32