⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 providershelper.cs

📁 HeyCacher 高性能缓存方案(带源码) 1. 文件的所有权益归上传用户所有 2. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途 3. CSDN下载频道仅提供交流平台
💻 CS
字号:
//===============================================================================
// CSDN HeyCache 
//===============================================================================
// 修改记录:[按最后修改时间倒排序]
// 2007.06.11 by tangwei
//
// 代码来源:参考于.net frameworks
//===============================================================================
namespace HeyCacher.Providers.Common
{
    using System;
    using System.Collections.Specialized;
    using System.Configuration;
    using System.Configuration.Provider;
    using System.Security.Permissions;
    using System.Web;
    using System.Xml;

    /// <summary>
    /// Provider的Helper类,主要用于创建Provider对象用
    /// </summary>
    public class ProvidersHelper
    {
        /// <summary>
        /// 获取一个Provider的实例
        /// </summary>
        /// <param name="providerSettings"></param>
        /// <param name="providerType"></param>
        /// <returns></returns>
        public static ProviderBase InstantiateProvider(ProviderSettings providerSettings, Type providerType)
        {
            ProviderBase abstractProvider = null; //抽象对象
            try
            {
                //获取Provider的类型名称字符串
                string ProviderTypeName = (providerSettings.Type == null) ? null : providerSettings.Type.Trim();
                if (string.IsNullOrEmpty(ProviderTypeName))
                {
                    throw new ArgumentException("Provider_no_type_name");
                }

                //获取Provider的实际类型,非抽象类型
                Type ProviderType = GetType(ProviderTypeName, "type", providerSettings);
                if (!providerType.IsAssignableFrom(ProviderType))
                {
                    throw new ArgumentException("Provider_must_implement_type");
                }

                //通过ProviderType来创建一个真实的Provider对象,非抽象
                abstractProvider = (ProviderBase)Activator.CreateInstance(ProviderType);

                //建立config
                NameValueCollection config = new NameValueCollection(providerSettings.Parameters.Count, StringComparer.Ordinal);
                foreach (string tmpKey in providerSettings.Parameters)
                {
                    config[tmpKey] = providerSettings.Parameters[tmpKey];
                }

                //调用Provider的初始化
                abstractProvider.Initialize(providerSettings.Name, config);
            }
            catch (Exception exception)
            {
                if (exception is ConfigurationException)
                {
                    throw;
                }
                throw new ConfigurationErrorsException(exception.Message, providerSettings.ElementInformation.Properties["type"].Source, providerSettings.ElementInformation.Properties["type"].LineNumber);
            }
            return abstractProvider;
        }

        /// <summary>
        /// 获取一组Provider的实例集合
        /// </summary>
        /// <param name="configProviders"></param>
        /// <param name="providers"></param>
        /// <param name="providerType"></param>
        public static void InstantiateProviders(ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)
        {
            foreach (ProviderSettings settings in configProviders)
            {
                providers.Add(InstantiateProvider(settings, providerType));
            }
        }

        /// <summary>
        /// 取得类型
        /// </summary>
        /// <param name="typeName">类型名称字符串</param>
        /// <param name="propertyName">异常时用</param>
        /// <param name="configElement">异常时用</param>
        /// <returns></returns>
        internal static Type GetType(string typeName, string propertyName, ConfigurationElement configElement)
        {
            Type myType; //获取的类型结果
            try
            {
                //在asp.net程序集中按类型名称检索类型
                //myType = System.Web.Compilation.BuildManager.GetType(typeName, true, true);
                myType = System.Type.GetType(typeName);
            }
            catch (Exception exception)
            {
                //线程错误等错误直接抛出
                if (((exception is System.Threading.ThreadAbortException) || (exception is StackOverflowException)) || (exception is OutOfMemoryException))
                {
                    throw;
                }

                //否则为配置错误
                throw new ConfigurationErrorsException(exception.Message, exception, configElement.ElementInformation.Properties[propertyName].Source, configElement.ElementInformation.Properties[propertyName].LineNumber);
            }

            //返回类型
            return myType;
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -