私は、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
}
:もちろん、これはその後...あなたはgetおよびsetメソッドにユーザーIDを渡す必要があるだろう
を意味し、あなたはおそらくこのような何かを行うことができますコントローラタグは、パターンに関する質問用です。 ASP.NET-MVCの実装には特定のタグがあります。 –