使用提供者模型的好處:使用提供者模型的系統將具有很好的彈性和可擴充性。
例如你可以使用sql server資料或者是Oracle資料庫做為你的資料來源,並且只需要改變一下web.config檔案。
下面以一個公司的人員資訊的儲存進行講解。現在我們用來儲存人員資訊(personInfo)的資料庫是
sql server2005,考慮到以後會使用其他資料庫(例如mysql,oracle),我們打算用提供者模型方式進行 系統設計。
1:web.config的配置,增加如下自訂配置節
<Company personInfoProviderName="sqlProvider">
<PersonInfoProviders>
<add name="sqlProvider" type="Company.SqlPersonInfoProvider"/>
</PersonInfoProviders>
</Company>
2: 如果以後改用其他方式進行資料存放區,可以這樣修改
<Company personInfoProviderName="mysqlProvider">
<PersonInfoProviders>
<add name="sqlProvider" type="Company.SqlPersonInfoProvider"/>
<add name="mysqlProvider" type="Company.MysqlPersonInfoProvider"/>
</PersonInfoProviders
>
</Company>
3:還沒有完,你還得在web.config裡增加如下代碼
<configSections>
<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的屬性相互對應,
然後通過這個類來或得我們的提供者到底是誰。
Code
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:好,寫到這裡,但最重要的還沒寫,就是如何或得並且使用提供者。我們現在需要新增人員資訊。
Code
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;
}
}
}