自定义配置部分中的多个元素
本文关键字:元素 配置部 自定义 | 更新日期: 2023-09-27 18:00:32
UPDATE:自定义配置非常困难!><虽然我已经了解了一些关于XML的知识;显然,在元素中存储CDATA是不可能的,所以我重新表述了这个问题以适应修改后的结构。为了清楚起见,请问我任何问题。我断断续续地在这个问题上工作了大约一个月,不断遇到各种各样的问题。
我一直在遵循下面引用的文章中的MSDN示例,但在将这个概念应用于我的案例时遇到了困难。我的项目是VS2010中的VB.NET 4.0 Web应用程序,但C#中的答案也可以(只要解决方案在VB中有效)。:)这是相关代码:
呼叫:
Dim conf As ApiSection = CType(ConfigurationManager.GetSection("remoteServiceApi/site"), ApiSection)
异常(配置错误异常)
The element <site> may only appear once in this section.
请注意以下相关代码。。。
架构:
<xs:element name="ApiSection">
<xs:complexType>
<xs:sequence>
<xs:element name="site" id="environment" nillable="false" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="environment" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Production"></xs:enumeration>
<xs:enumeration value="Sandbox"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="APIKey" type="xs:string" use="required" />
<xs:attribute name="APIUsername" type="xs:string" use="required" />
<xs:attribute name="APIPassword" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
尽管我在web.config文件的架构集中添加并激活了上述内容,但它似乎实际上并不起作用(这可能是问题所在吗?
Web.Config:
<configSections>
<sectionGroup name="remoteServiceApi">
<section name="site" type="RemoteServiceApi.ApiSection" />
</sectionGroup>
</configSections>
<remoteServiceApi environment="Sandbox">
<site environment="Sandbox"
APIKey="reallyLongHashKeyDev"
APIUsername="samplejoe"
APIPassword="joespass" />
<site environment="Production"
APIKey="reallyLongHashKeyProd"
APIUsername="samplejoe"
APIPassword="joespass" />
</remoteServiceApi>
类文件:
Imports System.Configuration
Namespace RemoteServiceApi
Public Class ApiSection
Inherits ConfigurationSection
<ConfigurationProperty("site", IsRequired:=True)> _
Public Property site() As SiteElement
Get
Return CType(Me("site"), SiteElement)
End Get
Set(value As SiteElement)
Me("site") = value
End Set
End Property
End Class
Public Class SiteElement
Inherits ConfigurationElement
<ConfigurationProperty("Environment", DefaultValue:="Sandbox", IsRequired:=True)> _
Public Property Environment() As String
Get
Return CStr(Me("Environment"))
End Get
Set(value As String)
Me("Environment") = value
End Set
End Property
<ConfigurationProperty("APIKey", IsRequired:=True)> _
Public ReadOnly Property APIKey() As String
Get
Return CStr(Me("APIKey"))
End Get
End Property
<ConfigurationProperty("APIUsername", IsRequired:=True)> _
Public ReadOnly Property APIUsername() As String
Get
Return CStr(Me("APIUsername"))
End Get
End Property
<ConfigurationProperty("APIPassword", IsRequired:=True)> _
Public ReadOnly Property APIPassword() As String
Get
Return CStr(Me("APIPassword"))
End Get
End Property
End Class
Public Enum Environment
Production
Sandbox
End Enum
End Namespace
我正在使用的参考资料作为指南:
- 如何:使用ConfigurationSection创建自定义配置节
- 创建自定义配置(2004年发布,请谨慎遵循)
您需要使Site
元素成为一个集合(基于您发布的Web.config)
[ConfigurationCollection(typeof(SiteElement)[
public class SiteElementCollection : ConfigurationElementCollection
public SiteElement this[string name]
{
get
{
return (SiteElement)base.BaseGet(name);
}
}
public SiteElement this[int index]
{
get
{
return (SiteElement)base.BaseGet(index);
}
}
public override ConfigurationElement CreateNewElement()
{
return new SiteElement();
}
public override object GetElementKey(ConfigurationElement element)
{
return ((SiteElement)element).AddressKey;
}
这个类将封装SiteElement
,允许您拥有该元素的多个实例。
下一部分我不能100%确定,因为我从未在该部分下直接使用过ConfigurationElementCollection
,但您需要引用该集合。
举个例子(这不太适合你想要做的事情,但有望适合),假设你在节组下有一个节名Sites
。你可以这样做:
public SiteElementCollection Sites
{
get
{
return (SiteElementCollection)base["site"];
}
}
我希望这至少能给你一个方向。这里的关键是当您需要拥有给定元素的多个实例时,使用ConfigurationElementCollection。