使用提供者模型的好处:使用提供者模型的系统将具有很好的弹性和可扩充性。
例如你可以使用SQL server数据或者是Oracle数据库做为你的数据源,并且只需要改变一下web.config文件。
下面以一个公司的人员信息的存储进行讲解。现在我们用来存储人员信息(personInfo)的数据库是
SQL server2005,考虑到以后会使用其他数据库(例如mySQL,oracle),我们打算用提供者模型方式进行 系统设计。
1:web.config的配置,增加如下自定义配置节
<PersonInfoProviders>
<add name="sqlProvider" type="Company.SqlPersonInfoProvider"/>
</PersonInfoProviders>
</Company>
2: 如果以后改用其他方式进行数据存储,可以这样修改
<PersonInfoProviders>
<add name="sqlProvider" type="Company.SqlPersonInfoProvider"/>
<add name="mysqlProvider" type="Company.MysqlPersonInfoProvider"/>
</PersonInfoProviders >
</Company>
3:还没有完,你还得在web.config里增加如下代码
<section name="Company" type="Company.CompanyProvidersSection,Company"/>
</configSections>
以上代码必须紧跟在<configuration>的下面,否则会出错。
4:好了,这才开始我们的C#代码,他们所在的命名空间是Company.
首先新建三个类:PersonInfoProvider,SqlPersonInfoProvider,MysqlPersonInfoProvider。
PersonInfoProvider是个abstract类,它继承ProviderBase,它的作用是提供抽象的方法让
SqlPersonInfoProvider和MysqlPersonInfoProvider来实现。
例如你要增加或删除人员,那么你首先要在PersonInfoProvider里增加两个抽象的方法:
public abstract void DeletePerson();
public abstract void AddPerson();
这只是第一步,第二步你还得在SqlPersonInfoProvider里进行具体的实现。
5:你还要在新建一个类:CompanyProvidersSection,这个类的属性主要是和web.config的属性相互对应,
然后通过这个类来或得我们的提供者到底是谁。
1public class CompanyProviderSection
2{
3 [ConfigurationProperty("personInfoProviderName")]
4 public string PersonInfoProviderName()
5 {
6 get{return (string)this["personInfoProviderName"];}
7 }
8
9 [ConfigurationProperty("PersonInfoProviders")]
10 public ProviderSettingsCollection PersonInfoProviders
11 {
12 get{return (ProviderSettingsCollection)this["PersonInfoProviders"];}
13 }
14
15}
6:好,写到这里,但最重要的还没写,就是如何或得并且使用提供者。我们现在需要添加人员信息。
class UseProvider
{
private static PersonInfoProvider _provider;
private static CompanyProvidersSection _providerSection;
private static bool _isInitialized = false;
private static PersonInfoProvider Provider
{
return _provider;
}
public static void AddPerson()
{
Provider.AddPerson();
}
private static void Initialize()
{
if(!_isInitialized)
{
_providerSection = (CompanyProvidersSection)ConfigurationManager.Getsection("Compnay");
_provider = (PersonInfoProvider)ProviderHelper.InstantiateProvider(_providerSection.PersonInfoProviders[_providerSection.PersonInfoProviderName]);
_isInitiallized = true;
}
}
}