MVCWebアプリケーションでの静的クラスの使用について説明している記事をいくつか読みました。これらの記事から、静的変数が実際にユーザーセッション間で共有されていることを証明するための小さな例を作成しました。
2つの異なるブラウザー、Windows認証、および2つの異なるユーザーアカウントを使用してサイトにログインしました。変数がnullの場合、ユーザーがログインしたときに特定の変数が設定されます。最初のユーザーが変数=1にログインした後、ユーザー2がセッションを開始したときにこれにアクセスすると、予想どおり、これがまだ=1であることがはっきりとわかります。これまでのところ、正常に動作します。
本当の問題は、MemoryContainerという名前のIOCのクラスを使用しているということです。このMemorycontainerクラスの一部は静的であるため、このコンテナーに登録されているクラスは、MVCのユーザーセッション間でも共有されますか?
完全なコード:
public class MemoryContainer
{
#region Singleton
private static volatile MemoryContainer instance;
private static object syncRoot = new Object();
private MemoryContainer()
{}
private void Initialize()
{
myContainer = new Dictionary<Type, object>();
}
public static MemoryContainer Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new MemoryContainer();
instance.Initialize();
}
}
}
return instance;
}
}
#endregion
Dictionary<Type, object> myContainer = null;
private Dictionary<Type, object> Container
{
get { return this.myContainer; }
}
public void RegisterInstance(Type type, object instance)
{
if (!myContainer.ContainsKey(type))
myContainer.Add(type, instance);
}
public void UpdateInstance(Type type, object newInstance)
{
if (this.myContainer.ContainsKey(type))
myContainer[type] = newInstance;
}
public T Resolve<T>(Type t) where T : class
{
T item = (T) myContainer[t];
myContainer.Remove(t);
return item;
}
public T TryResolve<T>(Type t) where T : class
{
if (this.myContainer.ContainsKey(t))
return (T) Resolve<T>(t);
return null;
}
public T Peek<T>(Type t) where T : class
{
if (this.myContainer.ContainsKey(t))
return (T) myContainer[t];
return null;
}
}