实现自定义配置节处理程序 [英] Implementing custom configuration section handler
问题描述
来自各种来源(包括stackOverlflow)的整理,但是当我使用它时,会收到以下错误消息
gleanings from a variety of sources (including stackOverlflow), however when I come to use it, I get the following error message
配置属性'deviceconfig'
"The Configuration property 'deviceconfig' may not be derived from ConfigurationSection."
我在一天的大部分时间里一直在为此苦苦挣扎,而且还没有一个解决方案,因此在此事将不胜感激。我是实现自定义配置部分的新手,因此请轻柔地对待我:-)
I have been struggling with this for the better part of a day now, and am no nearer a solution, so any help in the matter would be greatly appreciated. I am a newbie in implementing custom config sections so please treat me gently :-)
app.config文件如下所示:
The app.config file looks like this:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="deviceconfig" type="CNIMonitor.Core.CustomConfig.DeviceConfig,Core"/>
</configSections>
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Uncomment the below section to write to the Application Event Log -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<deviceconfig>
<devices>
<device deviceid = "1"
name = "localhost"
ipaddress="127.0.0.1"
port="10000"
status="not listening"
message="no message"
/>
<device deviceid ="2"
name ="2nd localhost"
ipaddress="127.0.0.1"
port="20000"
status="not listening"
message="no message"
/>
</devices>
</deviceconfig>
自定义部分处理程序代码为
The Custom Section Handler code as follows:
Imports System.Configuration
命名空间CNIMonitor.Core.CustomConfig
Namespace CNIMonitor.Core.CustomConfig
Public Class DeviceConfig
Inherits ConfigurationSection
<ConfigurationProperty("deviceconfig")> _
Public ReadOnly Property DeviceConfig() As DeviceConfig
Get
Return CType(MyBase.Item("deviceconfig"), DeviceConfig)
End Get
End Property
End Class
<ConfigurationCollectionAttribute(GetType(Device))> _
Public Class Devices
Inherits ConfigurationElementCollection
Protected Overrides Function CreateNewElement() As ConfigurationElement
Return New Device
End Function
Protected Overrides Function GetElementKey _
(ByVal element As ConfigurationElement) As Object
Return CType(element, Device).DeviceID
End Function
Public Sub Add(ByVal element As Device)
Me.BaseAdd(element)
End Sub
End Class
Public Class Device
Inherits ConfigurationElement
<ConfigurationProperty("deviceid", DefaultValue:="", IsKey:=True, IsRequired:=True)> _
Public Property DeviceID() As String
Get
Return CType(MyBase.Item("deviceid"), String)
End Get
Set(ByVal value As String)
MyBase.Item("deviceid") = value
End Set
End Property
<ConfigurationProperty("hostname", DefaultValue:="", IsKey:=True, IsRequired:=False)> _
Public Property HostName() As String
Get
Return CType(MyBase.Item("RegisteredDate"), String)
End Get
Set(ByVal value As String)
MyBase.Item("RegisteredDate") = value
End Set
End Property
<ConfigurationProperty("ipaddress", DefaultValue:="", IsKey:=True, IsRequired:=False)> _
Public Property IpAddress() As String
Get
Return CType(MyBase.Item("ipaddress"), String)
End Get
Set(ByVal value As String)
MyBase.Item("ipaddress") = value
End Set
End Property
<ConfigurationProperty("port", DefaultValue:="", IsKey:=True, IsRequired:=False)> _
Public Property Port() As String
Get
Return CType(MyBase.Item("port"), String)
End Get
Set(ByVal value As String)
MyBase.Item("port") = value
End Set
End Property
<ConfigurationProperty("status", DefaultValue:="", IsKey:=False, IsRequired:=False)> _
Public Property Status() As String
Get
Return CType(MyBase.Item("status"), String)
End Get
Set(ByVal value As String)
MyBase.Item("status") = value
End Set
End Property
<ConfigurationProperty("message", DefaultValue:="", IsKey:=False, IsRequired:=False)> _
Public Property Message() As String
Get
Return CType(MyBase.Item("message"), String)
End Get
Set(ByVal value As String)
MyBase.Item("message") = value
End Set
End Property
End Class
End Namespace
推荐答案
顶级不需要DeviceConfig属性。您要做的是为 ConfigurationElementCollection
设备添加一个属性。我还要将您的 Devices
类重命名为不太模糊的名称,例如 DeviceElementCollection
。尝试以下操作:
The DeviceConfig property is not needed at the top level. What you do need to do is add a property for your ConfigurationElementCollection
devices. I would also rename your Devices
class something a little less ambiguous, say, DeviceElementCollection
. Try this:
Public Class DeviceConfig
Inherits ConfigurationSection
<ConfigurationProperty("Devices")> _
Public ReadOnly Property Devices() As DeviceElementCollection
Get
Return CType(Me("Devices"), DeviceElementCollection)
End Get
End Property
End Class
然后,在您定义的 DeviceElementCollection
,如果不添加以下内容,则可能会遇到问题:
Then, in your definition for DeviceElementCollection
, you may have problems if you don't add the following:
Public Overrides ReadOnly Property CollectionType() As System.Configuration.ConfigurationElementCollectionType
Get
Return ConfigurationElementCollectionType.BasicMap
End Get
End Property
Protected Overrides ReadOnly Property ElementName() As String
Get
Return "Device"
End Get
End Property
我写道回答了一个类似问题的答案(很抱歉,在C#中)此处。
I wrote up a pretty long answer to a similar question (sorry, in C#) here.
更新-如何在代码中使用
Dim deviceConfiguration as DeviceConfig = ConfigurationManager.GetSection("deviceconfigs")
For Each device As Device in deviceConfiguration.Devices
'...whatever you need to do
Next
这篇关于实现自定义配置节处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!