2017-05-11 6 views
0

私は、ASP.NET MVCプロジェクトとWPFアプリケーションを含むいくつかのプロジェクトのソリューションを持っています。 DBには、両方のアプリケーションで使用したい一般的な設定がいくつかあります。これを行うために、クラスライブラリFooを作成して辞書に設定をロードし、ディクショナリから特定の設定にアクセスする方法をGet(string key)に提供しました。 設定はユーザーによって上書きできるため、UserIdを含むプロパティを追加しました。 Get()メソッドは自動的にチェックし、UserIdプロパティを使用します。この方法では、Get()メソッドを呼び出すたびに、UserIdをパラメータとして渡す必要はありません。非静的メンバーがASP.NET MVCアプリケーションのインスタンス間で共有される静的クラスですか?

WPFアプリケーションの場合は、インスタンスが1つしか実行されていないので、これはうまく動作します。しかし、Webプロジェクトでは、辞書を1回だけ(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; 
    } 
} 

のGlobal.asax:

public static Foo MyFoo; 

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

UserController.cs:

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

:もちろん、これはその後...あなたはgetおよびsetメソッドにユーザーIDを渡す必要があるだろう

を意味し、あなたはおそらくこのような何かを行うことができますコントローラタグは、パターンに関する質問用です。 ASP.NET-MVCの実装には特定のタグがあります。 –

答えて

1

保存についてDictionary<int<Dictionary<string, string>>の設定では、外部辞書のKeyはがデフォルト設定として保存されているUserIdですか?そのモデル - ビュー - 注意してください

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; 
    }   
} 
+0

私は実際にそのように試してみました。それはうまく動作します。それは私が怠け者で、Get()の呼び出しごとにユーザIDを渡すことを望まないため、これを解決するためのより良い/他の方法があるのだろうかと思っていたのです。 –

関連する問題