具有非静态成员的静态类在ASP.NET MVC应用程序的实例之间共享?

时间:2017-05-11 14:11:19

标签: c# asp.net-mvc static

我有几个项目的解决方案,包括ASP.NET MVC项目和WPF应用程序。在DB中,我有一些常规设置,我想在两个应用程序中使用。为此,我创建了一个类库Foo,它将设置加载到字典中,并提供Get(string key)方法来访问字典中的特定设置。 由于用户可以覆盖设置,因此我添加了一个包含UserId的属性。 Get()方法自动负责检查和使用UserId属性。这样,每次调用Get()方法时,我都不需要将UserId作为参数传递。

对于WPF应用程序,这很好用,因为只有一个实例在运行。但是对于Web项目,我想只填充一次字典(在Application_Start()中),并且访问该站点的所有用户都可以访问该字典。如果我使类实例静态,这可以正常工作。但是,这不允许我使用不同的UserIds,因为每个访问该站点的用户都会覆盖这个public class Foo () { private Dictionary<string, string> Res; private int UserId; public Foo () { Res = DoSomeMagicAndGetMyDbValues(); } public void SetUser (int userId) { UserId = userId; } public string Get(string key) { var res = Res[key]; // do some magic stuff with the UserId return res; } } 。解决这个问题的最佳方法是什么?

这是我到目前为止所尝试的内容(非常简化):

班级图书馆:

public static Foo MyFoo;

protected void Application_Start()
{
    MyFoo = new Foo();
}

的Global.asax:

public ActionResult Login(int userId)
{
    MvcApplication.MyFoo.SetUser(userId); // <-- this sets the same UserId for all instances
}

UserController.cs:

{{1}}

1 个答案:

答案 0 :(得分:1)

如果将设置存储在Dictionary<int<Dictionary<string, string>>,外部字典的KeyUserId,并为默认设置保存了密钥0,该怎么办?当然,这意味着您必须将用户ID传递给Get和Set方法......

然后,你可能会做这样的事情:

public static class Foo
{
    private static Dictionary<int, Dictionary<string, string>> settings;

    /// <summary>
    /// Populates settings[0] with the default settings for the application
    /// </summary>
    public static void LoadDefaultSettings()
    {
        if (!settings.ContainsKey(0))
        {
            settings.Add(0, new Dictionary<string, string>());
        }

        // Some magic that loads the default settings into settings[0]
        settings[0] = GetDefaultSettings();
    }

    /// <summary>
    /// Adds a user-defined key or overrides a default key value with a User-specified value
    /// </summary>
    /// <param name="key">The key to add or override</param>
    /// <param name="value">The key's value</param>
    public static void Set(string key, string value, int userId)
    {
        if (!settings.ContainsKey(userId))
        {
            settings.Add(userId, new Dictionary<string, string>());
        }

        settings[userId][key] = value;
    }

    /// <summary>
    /// Gets the User-defined value for the specified key if it exists, 
    /// otherwise the default value is returned.
    /// </summary>
    /// <param name="key">The key to search for</param>
    /// <returns>The value of specified key, or empty string if it doens't exist</returns>
    public static string Get(string key, int userId)
    {
        if (settings.ContainsKey(userId) && settings[userId].ContainsKey(key))
        {
            return settings[userId][key];
        }

        return settings[0].ContainsKey(key) ? settings[0][key] : string.Empty;
    }        
}