将变量从控制器传递给singleton类并在任何地方访问此变量

时间:2018-04-17 04:34:48

标签: c# singleton

我试图利用单例类来存储登录用户名的变量。

我在LoginController中从Request.QueryString["username"]获取用户名。

我将以下类作为singleton:我的问题是如何在单例类中传递此Request.QueryString["username"]并在应用程序的任何位置访问此变量?我想在每个控制器中访问此变量。请帮忙。

public sealed class Settings
{
    private static Settings instance = null;
    static readonly object padlock = new object();

// initialize your variables here. You can read from database for example
Settings()
{
    this.UserName= "prop1"; // I want to push the variable here
}

public static Settings Instance
{
    get
    {
        lock (padlock)
        {
            if (instance == null)
            {
                instance = new Settings();
            }
            return instance;
        }
    }
}

// declare your global variables here
public string UserName{ get; set; }

}

1 个答案:

答案 0 :(得分:0)

假设您希望拥有基于用户的上下文(由Session自身内部完成)

将字典对象创建为Dictionary>存储状态。外部字典将保存userName,而内部字典将保存上下文。

下面的Pseudeo代码

// 1.这个字典只需要在静态构造函数中初始化。

static ctor() {
   stateObject = new Dictionary<string, Dictionary<string, object>()
}

// 2.有一个Login / Logout方法,每个方法都将userName作为参数。

Login(userName) {
   if (stateObject.Keys[userName])   throw new Exception('user already logged in');
   else  stateObject.insert(userName, new Dictionary....)
}

Logout(userName) {
  if (stateObject.Keys[userName])
      stateObject.Remove(userName)
}

// 3.公开成员以获得所需的状态

State(userName, propertyKey) {
     if (stateObject.Keys[userName])
         if (stateObject.Keys[userName].Keys[propertyKey])
             return (stateObject.Keys[userName].Keys[propertyKey])
    else  .. handle exceptions
}

您需要在此处再次传递userName的原因是您正在使用Singleton,因此所有实例都将具有其访问权限。 Session隐式传递sessionId,但行为方式完全相同