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 ?
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 ?
的操作就是得到一个CatalogProvider 的对象LoadProvider()是这个对象的 现实原理
这里应该是 用于CatalogProvider 对象的cache缓存的一个实现
这是一个怎样的想法?
Commerce.Providers.CatalogProvider.Instance.方法
{ 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;
}