怎样写自己的ConfigurationHandler(DOTNETNUKE 研究)?
DOTNETNUKE 配置文件类有:
ProviderConfigurationHandler类
Provider类
ProviderConfiguration类
web.config文件中引用ProviderConfigurationHandler,该类继承.NET FrameWork接口IConfigurationSectionHandler
<sectionGroup name="dotnetnuke">
<section name="data" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke" />
</sectionGroup>
</configSections>
实现Create方法如下:
Dim objProviderConfiguration As New ProviderConfiguration
objProviderConfiguration.LoadValuesFromConfigurationXml(node)
Return objProviderConfiguration
End Function
主要是使用了ProviderConfiguration得LoadValuesFromConfiguration()方法
该方法主要对Providers hashtable值进行操作,通过读取web.config文件中得<data>子节点值,装载到Providers中
主要代码如下:
Dim attributeCollection As XmlAttributeCollection = node.Attributes
' Get the default provider
_DefaultProvider = attributeCollection("defaultProvider").Value
' Read child nodes
Dim child As XmlNode
For Each child In node.ChildNodes
If child.Name = "providers" Then
GetProviders(child)
End If
Next child
End Sub
Friend Sub GetProviders(ByVal node As XmlNode)
Dim Provider As XmlNode
For Each Provider In node.ChildNodes
Select Case Provider.Name
Case "add"
Providers.Add(Provider.Attributes("name").Value, New Provider(Provider.Attributes))
Case "remove"
Providers.Remove(Provider.Attributes("name").Value)
Case "clear"
Providers.Clear()
End Select
Next Provider
End Sub
当其子节点为“add”时,新建一个Provider实体,并放入Providers 哈西表中。
Return CType(Config.GetSection("dotnetnuke/" & strProvider), ProviderConfiguration)
End Function
GetProviderConfiguration(strProvider)方法作用是获取web.config节点信息,并装入到ProviderConfiguration类实体当中。
所以该类的操作都是围绕着providers哈西表来得,即把取得的provider数据都放入该哈西表中。
下面介绍Provider类
其有两个属性:
Public Readonly property Name()as string
public ReadOnly property Type() as string
一个New(XmlattributeCollection)方法
该方法做了一些设置属性值得操作,从XmlattributeCollection中获取值。
并且做了把一些其他该xml属性集合放入到一个NameValueCollection集合当中。
web.config 节点如下:
<providers>
<clear />
<add name="SqlDataProvider" type="DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider" connectionStringName="SiteSqlServer" upgradeConnectionString="" providerPath="~\Providers\DataProviders\SqlDataProvider\" objectQualifier="" templateFile="DotNetNuke_template.mdf" databaseOwner="dbo" />
</providers>
</data>
应用:
Dim appName As String
'Get the Data Provider Configuration
Dim _providerConfiguration As ProviderConfiguration = ProviderConfiguration.GetProviderConfiguration("data")
//装入ProviderConfiguration类实体
' Read the configuration specific information for the current Provider
Dim objProvider As Provider = CType(_providerConfiguration.Providers(_providerConfiguration.DefaultProvider), Provider)
//读取Providers哈西表中的DefaultProvider值
'Get the Object Qualifier frm the Provider Configuration
Dim _objectQualifier As String = objProvider.Attributes("objectQualifier")
If _objectQualifier <> "" And _objectQualifier.EndsWith("_") = False Then
_objectQualifier += "_"
End If
appName = _objectQualifier + Convert.ToString(PortalID)
Return appName
End Function
以上三个类究竟在一个系统中有什么用呢?我个人理解认为是为了灵活性,我们可以直接在config文件修改provider值,就可实现我们究竟需要使用哪一个provider,而不需要重新编译,对于一个系统比较好维护,灵活性比较高。
设计技术点:
configManager类(Getsection()方法的使用)
IConfigurationSectionHandler接口 - ProviderconfigurationHandler继承该接口
hashtable、NamevalueCollection、XmlattributeCollection、xmlNode类型的使用