0

我已经阅读了几篇解释在 MVC Web 应用程序中使用静态类的文章。从这些文章中,我创建了一个小示例来证明静态变量确实在用户会话之间共享。

我使用 2 个不同的浏览器、Windows 身份验证和 2 个不同的用户帐户登录到我的站点。如果变量为空,则在用户登录时设置特定变量。在第一个用户登录变量 = 1 之后。当我在用户 2 开始他的会话时访问它时,我可以清楚地看到它仍然 = 1,正如预期的那样。到目前为止,它工作正常。

真正的问题是:我们正在为 IOC 使用一个名为 MemoryContainer 的类。由于这个 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创建该类的一个实例。这意味着每当您触摸Instance属性时,您总是指向内存中的同一位置。因此,多个用户将共享相同的数据。

还应注意,由于此类使用 aDictionary<TKey, TValue>用于内部存储,因此此类不是线程安全的,不应在 ASP.NET 应用程序等多线程环境中使用,除非您正确同步对该资源的访问或使用线程安全的数据结构(例如一个ConcurrentDictionary<TKey, TValue>例子)。所以这个自定义构建的 IoC 容器很好,但不应该在多线程应用程序中使用,除非它是线程安全的。

于 2012-05-02T14:19:05.323 回答