0

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;
    }
}
4

1 に答える 1

3

シングルトンパターンを使用しているため、MemoryContainerクラスのインスタンスは1つだけ作成されます。これは、プロパティに触れるたびにInstance、常にメモリ内の同じ場所を指していることを意味します。したがって、複数のユーザーが同じデータを共有します。

また、このクラスは内部ストレージにを使用するDictionary<TKey, TValue>ため、このクラスはスレッドセーフではなく、このリソースへのアクセスを適切に同期するか、スレッドセーフなデータ構造(ConcurrentDictionary<TKey, TValue>たとえば)。したがって、このカスタムビルドのIoCコンテナは問題ありませんが、スレッドセーフにすることなくマルチスレッドアプリケーションで使用しないでください。

于 2012-05-02T14:19:05.323 に答える