开发自定义的Provider

简介:

asp.net 2.0在很多地方都用到Provider Pattern,比如Personalization、MemberShip等都用到了该模式,其可插拔的特性给开发人员极大的便利,开发人员可以更据自己的需求来开发自己的需要

.Net 2.0中给我们已经定义了一个ProviderBase的抽象类,继承自它我们可以方便的开发自定义的Provider

首先我们写一个抽象类,用来定义好我们需要的抽象方法和接口,为了方便调用,我们为这个类定义了一个静态的构造器,用来实例化该抽象类调用的真正的Provider的实现,并通过Instance()返回其实例化后的对象,我们就可以通过BlogDataProvider.Instance()来调来所用到的实例了


    
    
     public   abstract    class  BlogDataProvider:ProviderBase
    
{
        
private static BlogDataProvider _provider = null;
        
private static CusProviderCollection<BlogDataProvider> _providers = null;
        
private static object _lock = new object();

        
static BlogDataProvider()
        
{
            CreateDefaultCommonProvider();
        }

        
public static BlogDataProvider Instance()
        
{
            
return _provider;
        }


        
private static void CreateDefaultCommonProvider()
        
{
            
if (_provider ==null)
            
{
                
lock (_lock)
                
{
                    
if (_provider == null)
                    
{
                        ProvidersConfigSection section 
= (ProvidersConfigSection)ConfigurationManager.GetSection("system.web/dataService");

                        
//ProviderSettingsCollection Settings = (ProviderSettingsCollection)section["providers"];

                        _providers 
= new CusProviderCollection<BlogDataProvider>();

                        ProvidersHelper.InstantiateProviders(section.Providers, _providers, 
typeof(BlogDataProvider));

                        _provider 
= _providers["SqlBlogDataProvider"];
                    }

                }


            }

        }

        
public abstract void AddBlog(DHBlog blog);
        
public abstract void UpdateBlog(DHBlog blog);

        
public abstract void DeleteBlog(int id);

    }

由于我们用的是ProviderHelper.InstatiateProviders来调用配置文件中定义的类,所以我们还要实现其两个参数定义的类,一个是继承自ConfigurationSection用来读
取配置节点的ProvidersConfigSection

 

   
   
     public   class  ProvidersConfigSection : ConfigurationSection
    
{
        [ConfigurationProperty(
"providers")]
        
public ProviderSettingsCollection Providers
        
{
            
get
            
{
                
return (ProviderSettingsCollection)base["providers"];
            }

        }

    }

还有一个就是实现自ProviderCollection的一个Provider的集合类,因为我们要定义多种不同的Provider所以用一个泛型来实现


   
   
     public   class  CusProviderCollection < T > :ProviderCollection
        where T:ProviderBase
    
{
        
        
public new T this[string name]
        
{
            
get
            
{
                
return (T)base[name];
            }

        }


        
public override void Add(ProviderBase provider)
        
{
            
if (provider == null)
                
throw new ArgumentNullException("provider");
            
if (!(provider is T))
                
throw new ArgumentException
                      (
"Invalid provider type""provider");
            
base.Add(provider);
        }

    }

然后是我们要求的类的功能的具体实现
  public   class  SqlBlogDataProvider:BlogDataProvider
    
{
        
private string _applicationName;
        
public string ConnectonString getset; }

        
public override void Initialize(string name, NameValueCollection config)
        
{
            
if (config == null)
                
throw new ArgumentException("config");

            
if (String.IsNullOrEmpty(name))
                name 
= "SqlBlogDataProvider";

            
if (string.IsNullOrEmpty(config["description"]))
            
{
                config.Remove(
"description");
                config.Add(
"description""SQL Blog provider");
            }


            
base.Initialize(name, config);

            _applicationName 
= config["applicationName"];
            
if (string.IsNullOrEmpty(_applicationName))
                _applicationName 
= "/";

            
string strconn = config["connectionStringName"];

            
if (string.IsNullOrEmpty(strconn))
                
throw new ProviderException ("Empty or missing connectionStringName");


            config.Remove(
"connectionStringName");

            
if (ConfigurationManager.ConnectionStrings[strconn] == null)
                
throw new ProviderException("Missing connection string");
            
this.ConnectonString = ConfigurationManager.ConnectionStrings[strconn].ConnectionString;

            
if (String.IsNullOrEmpty(this.ConnectonString))
                
throw new ProviderException("Empty connection string");

        }


        
public override void AddBlog(DHBlog blog)
        
{
            DataBaseHelper.Insert
<DHBlog>(blog);
        }


        
public override void UpdateBlog(DHBlog blog)
        
{
            
throw new Exception("The method or operation is not implemented.");
        }


        
public override void DeleteBlog(int id)
        
{
            
throw new Exception("The method or operation is not implemented.");
        }

    }

}

Provider模式是能过配置文件来定义具体要实例化的类的,我们可以在我们的Web.config加入如下代码
< configuration >
  
< configSections >
    
< sectionGroup  name ="system.web" >
      
< section  name ="dataService"
               type
="MyDHServer.Compontents.DataProvider.ProvidersConfigSection,MyDHServer.Compontents"
               allowDefinition
="MachineToApplication"  
               restartOnExternalChanges
="true" />
    
</ sectionGroup >
</ configSections >
</ configuration >
.
< system .web >
< dataService >
      
< providers >
        
< add  name ="SqlBlogDataProvider"
             type
="MyDHServer.DataProvider.SqlDataProvider.SqlBlogDataProvider,MyDHServer.DataProvider"
             connectionStringName
="MyDHServerConn"   />
      
</ providers >
    
</ dataService >
</ system.web >






    本文转自无心之柳.NET博客园博客,原文链接:http://www.cnblogs.com/9527/archive/2007/06/01/767510.html,如需转载请自行联系原作者
相关文章
|
存储 编解码 对象存储
Python提取指定时间、经度与纬度的NC数据
【2月更文挑战第15天】本文介绍基于Python语言的netCDF4库,读取.nc格式的数据文件,并提取指定维(时间、经度与纬度)下的变量数据的方法~
597 3
Python提取指定时间、经度与纬度的NC数据
|
2月前
|
传感器 数据采集 算法
STM32的SPI双机通信实现
STM32的SPI双机通信实现
283 0
|
机器学习/深度学习 人工智能 数据可视化
基于YOLOv8的X光安检图像智能检测系统:八类违禁品/可疑物精准识别与实战部署
本项目基于最新的YOLOv8深度学习模型,构建了一套轻量、高效、可视化的 X光安检图像智能检测系统,可精准识别电池、刀具、打火机等八类常见违禁品/可疑物,结合图形界面,支持一键识别与部署,大幅提升安检自动化水平。
|
存储 编译器 Linux
深入理解 C 语言中的联合体
深入理解 C 语言中的联合体
|
Linux KVM 虚拟化
windwos上通过qemu直接开启img、qcow2等格式磁盘镜像(无需转vmdk)
QEMU 是一款开源虚拟化软件,支持多种硬件平台和虚拟化技术,如 KVM 加速。它可以在 Windows、Linux 和 macOS 上运行。本文介绍了 QEMU 的下载、安装、配置虚拟网卡、启动虚拟机、网络通信及快照管理等步骤。通过 QEMU,用户可以轻松创建和管理虚拟机,实现高效的开发和测试环境。
5617 0
windwos上通过qemu直接开启img、qcow2等格式磁盘镜像(无需转vmdk)
|
SQL 关系型数据库 MySQL
MySQL8 中文参考(八十)(3)
MySQL8 中文参考(八十)
119 3
|
数据中心
Terraform使用本地编译(In-house)的Providers
## Terraform Provider的全网标识符 Terraform的Provider在全网的的标识符由三部分组成,分别为`hostname`,`namespace`和`type`组成,即`//`。`hostname`是指分发、下载Provider的域名,默认为`registry.terraform.io`。`namespace`是指提供、开发Provider的组织的命名空间,默认为`has
1584 0
|
Oracle Java 关系型数据库
win11系统下载安装 jdk8安装与环境变量的配置
win11系统下载安装 jdk8安装与环境变量的配置
1250 0
|
SQL Java 关系型数据库
Hibernate - hibernate.cfg.xml配置文件详解
Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性。每个 Hibernate 配置文件对应一个 Configuration 对象–这样说不太正确,应该是项目初始化时会实例化Configuration对象,该实例对象(Configuration对象)会读取配置文件配置的属性值为实例对象赋值。
888 0
|
NoSQL Java 测试技术
Springboot2.x集成lettuce连接redis集群报超时异常Command timed out after 6 second(s)
最近在对一新开发Springboot系统做压测,发现刚开始压测时,可以正常对redis集群进行数据存取,但是暂停几分钟后,接着继续用jmeter进行压测时,发现redis就开始突然疯狂爆出异常提示:Command timed out after 6 second(s)......
807 0