NopCommerce中的单例

项目中经常会遇到单例的情况。大部分的单例代码都差不多像这样定义:

internal class SingletonOne
    {
        private static SingletonOne _singleton;

        private SingletonOne()
        {
        }

        public static SingletonOne Instance
        {
            get
            {
                if (_singleton == null)
                {
                    var instance = new SingletonOne();
                    Interlocked.CompareExchange(ref _singleton, instance, null);
                }

                return _singleton;
            }
        }
    }

但是很明显的一个缺点是这个类只能用作单例。

最近看了NopCommerce对单例有个包装。觉得有点新颖 给大家分享一下。

/// <summary>
    /// Provides access to all "singletons" stored by <see cref="Singleton{T}"/>.
    /// </summary>
    public class Singleton
    {
        static Singleton()
        {
            allSingletons = new Dictionary<Type, object>();
        }

        static readonly IDictionary<Type, object> allSingletons;

        /// <summary>Dictionary of type to singleton instances.</summary>
        public static IDictionary<Type, object> AllSingletons
        {
            get { return allSingletons; }
        }
    }
public class Singleton<T> : Singleton
    {
        static T instance;

        /// <summary>The singleton instance for the specified type T. Only one instance (at the time) of this object for each type of T.</summary>
        public static T Instance
        {
            get { return instance; }
            set
            {
                instance = value;
                AllSingletons[typeof(T)] = value;
            }
        }
    }

比如定义了一个类, 那么可以这样使用

public class Fake
{
}

Singleton<Fake>.Instance = new Fake();
原文地址:https://www.cnblogs.com/VectorZhang/p/5366812.html