亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

IConfigurationSectionHandler 接口的實現

系統 1676 0

IConfigurationSectionHandler 這個接口網絡討論的太多了

我剛遇到這個問題,所以也發個實例出來,是我自己的一個框架項目里的一部分。

盡量寫詳細點,歡迎初學者研究。

下面是app.config? web.config也可以的

<configuration>
? <configSections>
??? <section name="Framework" type="CWF.ClassFactory.CWF_ConfigHandler,CWF.ClassFactory"/>
? </configSections>
? <Framework>
??? <ClassFactory>
????? <!-- DataProcess -->
????? <class name="CWF.AbstractSP" type="CWF.DataProcess.CWF_AbstractSP,CWF.DataProcess" />
????? <class name="CWF.SQL" type="CWF.DataProcess.CWF_SQL,CWF.DataProcess" />
????? <class name="CWF.Access" type="CWF.DataProcess.CWF_Access,CWF.DataProcess" />
????? <class name="CWF.Oracle" type="CWF.DataProcess.CWF_Oracle,CWF.DataProcess" />
????? <class name="CWF.ParamList" type="CWF.DataProcess.ParamList,CWF.DataProcess" />
????? <class name="CWF.SimpleProce" type="CWF.DataProcess.CWF_SimpleProce,CWF.DataProcess" />
????? <!--Service-->
????? <class name="CWF.ServiceFactroy" type="CWF.Service.CWF_ServiceFactroy,CWF.Service" />
????? <class name="CWF.AbstractDF" type="CWF.Service.CWF_AbstractDF,CWF.Service" />
????? <class name="CWF.DailyFile" type="CWF.Service.CWF_DailyFile,CWF.Service" />
??? </ClassFactory>
? </Framework>

?

看到在configSections節點下我定義了一個section 節點,這個是段處理器節點,告訴程式他name屬性里指的節點名(本例為“Framework”)采用那個處理程式(type屬性),type屬性就是該段處理程式的具體方法

type="CWF.ClassFactory.CWF_ConfigHandler,CWF.ClassFactory"? 其中CWF.ClassFactory.CWF_ConfigHandler類實現了IConfigurationSectionHandler接口,CWF.ClassFactory是命名空間,以逗號相隔。具體的實現接口的辦法下面將列出代碼。

app.config里的Framework節點是我列出的類工廠里的所有類,設計思路是把底層的實體類和業務應用分開,才用了反射技術,當我們要調用一個類的時候只要告訴程式該類在app.config里的name(這個name也可以自定義),那么他就會讀取class節點name屬性匹配的節點的type屬性,然后反射出該類給調用者使用。

這樣的好處是我們不需要知道具體類的實際名稱和屬性,就可以調用它,并且底層類都寫在app.config里,也不需要你打開api幫助文檔,而且可以返回強類型對象,方便.net的智能提示我們編碼。可能這樣就會問了,反射是很靈活,但反射回來的是object對象,object是弱類型怎么能是強類型呢,其實我在反射上再封裝了一層強類型轉換而已。

下面就看看如何實現這個接口,方便的讀取Framework下面的節點。

在實現這個功能之前首先要了解IConfigurationSectionHandler 是如何工作的。

該接口只有一個方法:

Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object

Create方法,我就是 要實現這個方法。

ConfigurationManager.GetSection("Framework")? 這句話可能我們經常用,其實在我們調用GetSection(舊版本是: ConfigurationSettings.GetConfig)方法的時候他會調用Create方法,應為.NET下的這些類都實現了IConfigurationSectionHandler 接口,比如ConfigurationManager/ConfigurationSettings。

知道了他怎么運行的我們就可以搞定他了

Partial Class CWF_ConfigHandler
??? Implements IConfigurationSectionHandler
??? Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
??????? Return New CWFConfiguration(section)
??? End Function
End Class

CWF_ConfigHandler類是我自定義的,他實現IConfigurationSectionHandler接口并完成Ceate方法,這里我還定義了一個類CWFConfiguration并把xmlnode類型的section作為實例參數傳過去,然后我們就在該類里操作xml找到我們要的節點數據。

''' <summary>
''' 獲取類工廠的type類型
''' </summary>
''' <remarks></remarks>
Public Class CWFConfiguration
??? Public FW As XmlNode
??? Public Sub New(ByVal frame As XmlNode)
??????? FW = frame
??? End Sub
??? Public Function getClassType(ByVal className As String) As String
??????? Try
??????????? Return FW.SelectSingleNode("http://ClassFactory//class[@name='" & className & "']").Attributes("type").Value()
??????? Catch ex As Exception
??????????? Return String.Empty
??????? End Try
??? End Function
End Class

這里一個getClassType方法,返回type里的字符串 操作xml就不用多說了吧

我空間有xpath的詳細說明。這樣我們就找到了type里定義的類型。

下面看看如何調用:

Public Class CWF_GetFactory
??? ''' <summary>
??? ''' 獲取類工廠里的類
??? ''' </summary>
??? ''' <param name="className">類名</param>
??? ''' <returns>Object</returns>
??? ''' <remarks></remarks>
??? Public Function getClass(ByVal className As String) As Object
??????? Dim obj As Object = Nothing
??????? Dim cm As CWFConfiguration = CType(ConfigurationManager.GetSection("Framework"), CWFConfiguration)
??????? Dim t As String = cm.getClassType(className)
??????? Dim type As System.Type = System.Type.GetType(t)
??????? obj = Activator.CreateInstance(type)
??????? Return obj
??? End Function
End Class

這個類獲取我們要的用來獲取type里定義的類型,其中一個getClass方法傳遞給他我們查找的name屬性值就可以了

他返回需要的type,然后反射為type類型,實例化對象返回object,這樣我們的工作就完成了。可能你看了這個操作過程會覺得沒有必要這樣做,反而麻煩。但是我們要在系統底層添加一個類,或刪除一個類,就要修改類工廠,甚至更新全部關于該類工廠的所有引用,可能會導致整個工程換面,然而有了這層我們就只需要簡單的改改配置文件就能添加或刪除一個類工廠,對于程式可以不做任何的改動。

這里補充一點:ConfigurationManager 這個必須添加System.Configuration.dll的引用。

好了寫到這里,歡迎留言探討。

IConfigurationSectionHandler 接口的實現


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕第一页国产 | 99精品久久99久久久久 | 国产精品久久久久免费 | 国产一区在线免费观看 | 久久合 | 欧美成人免费xxx大片 | 久久久久女人精品毛片九一 | 久久永久影院免费 | 成人免费aa在线观看 | 不卡视频免费在线观看 | 一级毛片a女人刺激视频免费 | 日韩毛片免费在线观看 | 午夜社区| 大陆老太xxxxxxxxhd | 中文字幕久久久久久久系列 | 亚洲高清网站 | 久久国产香蕉一区精品 | 国内精品免费久久影院 | 天天操天天干天天玩 | 中文字幕精品一区二区精品 | 国产福利视频深夜福利 | 美欧毛片| 写真福利 第 页 在线视频 | 一级特黄性色生活片 | 老司机精品在线播放 | 这里只有精品国产 | 国产呦系列 欧美呦 日韩呦 | 中文字幕视频一区二区 | 特黄a大片免费视频 | 亚洲综合在线另类色区奇米 | 久久久噜久噜久久综合 | 美女个护士一级毛片亚洲 | 亚洲 欧美 成人日韩 | 久久香蕉国产线看观看网站 | 欧美精品国产日韩综合在线 | 亚洲成人福利在线 | 欧美不卡一区 | 国内自拍在线观看 | 深夜网站在线 | 噜噜嘿在线视频免费观看 | 欧美一级免费片 |