怎样写自己的ConfigurationHandler(DOTNETNUKE 研究)?

DOTNETNUKE 配置文件类有:

   ProviderConfigurationHandler类

   Provider类

   ProviderConfiguration类

web.config文件中引用ProviderConfigurationHandler,该类继承.NET FrameWork接口IConfigurationSectionHandler

 

   <configSections>
    
<sectionGroup name="dotnetnuke">
      
<section name="data" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke" />
    
</sectionGroup>
  
</configSections>

 

实现Create方法如下:

 

       Public Overridable Overloads Function Create(ByVal parent As Object, ByVal context As Object, ByVal node As System.Xml.XmlNode) As Object Implements IConfigurationSectionHandler.Create
            Dim objProviderConfiguration As New ProviderConfiguration
            objProviderConfiguration.LoadValuesFromConfigurationXml(node)
            Return objProviderConfiguration
        End Function

 

主要是使用了ProviderConfiguration得LoadValuesFromConfiguration()方法

该方法主要对Providers hashtable值进行操作,通过读取web.config文件中得<data>子节点值,装载到Providers中

主要代码如下:

Friend Sub LoadValuesFromConfigurationXml(ByVal node As XmlNode)
   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 哈西表中。

Public Shared Function GetProviderConfiguration(ByVal strProvider As String) As ProviderConfiguration
            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 节点如下:

 

<data defaultProvider="SqlDataProvider">
      
<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>

 

 

应用:

 

Public Function GetApplicationName(ByVal PortalID As Integer) As String

            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类型的使用

posted on 2006-04-06 22:26  Sunny  阅读(295)  评论(0编辑  收藏  举报