using System;
using System.Reflection;
using System.Collections.Specialized;
using System.Configuration.Provider;
using System.Data;
using System.Web.Caching;
using System.Web;
using System.Web.Configuration;
using System.Configuration;
namespace Commerce.Providers {    public abstract class CatalogProvider : System.Configuration.Provider.ProviderBase
    {        static CatalogProvider _instance;        static object padLock;
        public static CatalogProvider Instance {            get {
                CatalogProvider tempInstance;
                if (_instance == null)
                    padLock = new object();
                lock (padLock) {
                    tempInstance = LoadProvider();
                    _instance = tempInstance;
                }                return _instance;
            }
        }
        static CatalogProvider LoadProvider() {            // Get the names of the providers
            // Use the cache because the reflection used later is expensive
            Cache cache = System.Web.HttpRuntime.Cache;
            string cacheKey = null;            CatalogProvider _instanceLoader;
            CatalogProviderConfiguration config = CatalogProviderConfiguration.GetConfig();
            cacheKey = "CatalogProvider::" + config.DefaultProvider;
            object oProvider = cache.Get(cacheKey);
            if (oProvider != null) {
                _instanceLoader = (CatalogProvider)oProvider;
            } else {                try {                    // Read the configuration specific information for this provider
                    Provider CatalogProvider = (Provider)config.Providers[config.DefaultProvider];                    // The assembly should be in \bin or GAC
                    Type type = Type.GetType(CatalogProvider.Type);
                    _instanceLoader = (CatalogProvider)Activator.CreateInstance(type);                    // Initialize the provider with the attributes.
                    string cStringName = CatalogProvider.Attributes["connectionStringName"];
                    string cString = System.Configuration.ConfigurationManager.ConnectionStrings[cStringName].ConnectionString;
                    CatalogProvider.Attributes.Add("connectionString", cString);
                    _instanceLoader.Initialize(CatalogProvider.Name, CatalogProvider.Attributes);                    //pop it into the cache to keep out site from running into the ground :)
                    cache.Insert(cacheKey, _instanceLoader);                } catch (Exception e) {
                    throw new Exception("Unable to load provider", e);
                }
            }
            return _instanceLoader;
        }
///LoadProvider和Instance 各实现什么的功能?
这里为什么能使用CatalogProvider ?

解决方案 »

  1.   

    public static CatalogProvider Instance {
    的操作就是得到一个CatalogProvider 的对象LoadProvider()是这个对象的 现实原理
    这里应该是 用于CatalogProvider 对象的cache缓存的一个实现
      

  2.   

    在类CatalogProvider 引用CatalogProvider 
    这是一个怎样的想法?
      

  3.   

    是不是Instance的方法之后可以这样字引用
    Commerce.Providers.CatalogProvider.Instance.方法
      

  4.   

    public abstract class CatalogProvider : System.Configuration.Provider.ProviderBase
        {        static CatalogProvider _instance; //单件模式        static object padLock;           //同步锁
            public static CatalogProvider Instance {  //单件模式            get {
                    CatalogProvider tempInstance;
                    if (_instance == null)
                        padLock = new object();
                    lock (padLock) {
                        tempInstance = LoadProvider();
                        _instance = tempInstance;
                    }                return _instance;
                }
            }
            static CatalogProvider LoadProvider() {            // Get the names of the providers
                // Use the cache because the reflection used later is expensive
                Cache cache = System.Web.HttpRuntime.Cache;
                string cacheKey = null;            CatalogProvider _instanceLoader;
                CatalogProviderConfiguration config = CatalogProviderConfiguration.GetConfig();
                cacheKey = "CatalogProvider::" + config.DefaultProvider;
                object oProvider = cache.Get(cacheKey); //试图从缓存中获取对象
                if (oProvider != null) {
                    _instanceLoader = (CatalogProvider)oProvider;
                } else {
                       //如果缓存中没有,就实例化一个
                    try {                    // Read the configuration specific information for this provider
                        Provider CatalogProvider = (Provider)config.Providers[config.DefaultProvider];                    // The assembly should be in \bin or GAC
                        Type type = Type.GetType(CatalogProvider.Type);
                        _instanceLoader = (CatalogProvider)Activator.CreateInstance(type);                    // Initialize the provider with the attributes.
                        string cStringName = CatalogProvider.Attributes["connectionStringName"];
                        string cString = System.Configuration.ConfigurationManager.ConnectionStrings[cStringName].ConnectionString;
                        CatalogProvider.Attributes.Add("connectionString", cString);
                        _instanceLoader.Initialize(CatalogProvider.Name, CatalogProvider.Attributes);                    //pop it into the cache to keep out site from running into the ground :)
                        cache.Insert(cacheKey, _instanceLoader);                } catch (Exception e) {
                        throw new Exception("Unable to load provider", e);
                    }
                }
                return _instanceLoader;
            }