1.最简单的可以用继承IConfigurationSectionHandler来实现读取configure
public class WebAddresssSectionHandler : IConfigurationSectionHandler
{
public virtual object Create(object parent, object configContext, XmlNode section)
{
WebAddresss webAddresss = new WebAddresss();
if (section != null)
{
foreach (XmlNode item in section.SelectNodes("WebAddress"))
{
WebAddress webAddress = new WebAddress();
foreach (XmlAttribute attribute in item.Attributes)
{
switch (attribute.Name)
{
case "Type":
webAddress.Type = attribute.Value;
break;
case "Name":
webAddress.Name = attribute.Value;
break;
case "Url":
webAddress.Url = attribute.Value;
break;
default:
break;
}
}
webAddresss[webAddress.Name] = webAddress;
}
}
return webAddresss;
}
}
WebAddress就是数据类:
public class WebAddress
{
public string Type { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
对外只要实现一个获取配置的current实例来枚举:
public class WebAddresss
{
protected Dictionary<string, WebAddress> _webAddresses=new Dictionary<string, WebAddress>();
private static WebAddresss _currentAddresss = null;
public virtual WebAddress this[string name]
{
get { return _webAddresses[name]; }
set { _webAddresses[name] = value; }
}
public static WebAddresss Current
{
get
{
if (_currentAddresss == null)
{
_currentAddresss= System.Configuration.ConfigurationManager.GetSection("WebAddresss") as WebAddresss;
}
return _currentAddresss;
}
}
}
对应这个web.config就能如下配置:
<configuration>
<configSections>
<section name="casClientConfig" type="DotNetCasClient.Configuration.CasClientConfiguration, DotNetCasClient" />
<section name="WebAddresss" type="Com.Centaline.Framework.Kernel.Config.WebAddresssSectionHandler,Com.Centaline.Framework.Kernel" />
</configSections>
<!--<WebAddresss>
<WebAddress Name="GetUserByUserName" Url="http://uam.centaline.com:8081/aist-uam-web/rest/userOrgRest/getUserByUsername.json?username={0}" Type="Organization" />
<WebAddress Name="GetMenuChildListByMenuCode" Url="http://uam.centaline.com:8081/aist-uam-web/rest/permission/getMenuChildListByMenuCode.json?code={0}" Type="Permission" />
</WebAddresss>
<WebAdresssConfiguration>
这个高级用法codeproject上早有介绍,https://www.codeproject.com/Articles/10981/Understanding-Section-Handlers-App-config-File
现在主要介绍第二种办法
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
using Com.Centaline.Framework.Kernel.Config;
namespace Com.Centaline.Framework.Kernel.Config
{
public class WebAdresssConfiguration : ConfigurationSection
{
private static WebAddresss _currentAddresss = null;
public static WebAddresss Current
{
get
{
if (_currentAddresss == null)
{
WebAdresssConfiguration config =
(WebAdresssConfiguration)ConfigurationManager.GetSection("WebAdresssConfiguration") as
WebAdresssConfiguration;
WebAddresss webAddresss = new WebAddresss();
for (int index = 0; index < config.UrlElements.Count; index++)
{
WebAddress webAddress = new WebAddress();
webAddress.Name = config.UrlElements[index].Name;
webAddress.Type = config.UrlElements[index].Type;
if(string.IsNullOrEmpty(config.UrlElements[index].Url))
switch (webAddress.Name)
{
case "FindOrgZTreeList":
webAddress.Url = config.UrlElements[index].FindOrgZTreeList;
break;
case "HasPermission":
webAddress.Url = config.UrlElements[index].HasPermission;
break;
}
else
{
webAddress.Url = config.UrlElements[index].Url;
}
webAddresss[config.UrlElements[index].Name] = webAddress;
}
_currentAddresss = webAddresss;
}
return _currentAddresss;
}
}
private static WebAdresssConfiguration setting;
public static WebAdresssConfiguration Setting
{
get
{
if (setting == null)
setting = (WebAdresssConfiguration)ConfigurationManager.GetSection("WebAdresssConfiguration");
return setting;
}
}
[ConfigurationProperty("WebAddresss")]
[ConfigurationCollection(typeof(WebAddressConfigurationElementCollection), AddItemName = "WebAddress", ClearItemsName = "clearUrls", RemoveItemName = "RemoveUrl")]
public WebAddressConfigurationElementCollection UrlElements
{
get { return (WebAddressConfigurationElementCollection)this["WebAddresss"]; }
set { this["WebAddresss"] = value; }
}
//[ConfigurationProperty("DomainName", DefaultValue = "http://uam.centaline.com:8081/aist-uam-web/rest", IsRequired = false)]
//public string DomainName
//{
// get { return (string)this["DomainName"]; }
// set { this["DomainName"] = value; }
//}
}
public class WebAddressConfigurationElement : ConfigurationElement // 集合中的每个元素
{
public static string WebAddress = "";
[ConfigurationProperty("Name", DefaultValue = "", IsRequired = true)]
public string Name
{
get
{
WebAddress = (string)this["Name"];
return (string)this["Name"];
}
set { this["Name"] = value; }
}
[ConfigurationProperty("Type", DefaultValue = "", IsRequired = true)]
public string Type
{
get { return (string)this["Type"]; }
set { this["Type"] = value; }
}
[ConfigurationProperty("Url", DefaultValue = "", IsRequired = true)]
public string Url
{
get { return (string)this["Url"]; }
set { this["Url"] = value; }
}
[ConfigurationProperty("DomainOrg", DefaultValue = "http://uam.centaline.com:8081/aist-uam-web/rest/userOrgRest", IsRequired = false)]
public string DomainOrg
{
get { return (string)this["DomainOrg"]; }
set { this["DomainOrg"] = value; }
}
[ConfigurationProperty("DomainPermission", DefaultValue = "http://uam.centaline.com:8081/aist-uam-web/rest/permission", IsRequired = false)]
public string DomainPermission
{
get { return (string)this["DomainPermission"]; }
set { this["DomainPermission"] = value; }
}
[ConfigurationProperty("FindOrgZTreeList", DefaultValue = "#DOMAIN#/findOrgZTreeList.json?parentId={0}", IsRequired = false)]
public string FindOrgZTreeList
{
get { return ((string)this["FindOrgZTreeList"]).Replace("#DOMAIN#", (string)this["DomainOrg"]); }
set { this["FindOrgZTreeList"] = value; }
}
[ConfigurationProperty("HasPermission", DefaultValue = "#DOMAIN#/hasPermission.json?jobId={0}&resourceCode={1}", IsRequired = false)]
public string HasPermission
{
get { return ((string)this["HasPermission"]).Replace("#DOMAIN#", (string)this["DomainPermission"]); }
set { this["HasPermission"] = value; }
}
}
public class WebAddressConfigurationElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new WebAddressConfigurationElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((WebAddressConfigurationElement)element).Name;
}
public WebAddressConfigurationElement this[int index]
{
get { return (WebAddressConfigurationElement)BaseGet(index); }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
public WebAddressConfigurationElement this[string name]
{
get { return (WebAddressConfigurationElement)BaseGet(name); }
}
public void Add(WebAddressConfigurationElement webAddressConfigurationElement)
{
BaseAdd(webAddressConfigurationElement);
}
public void Clear()
{
BaseClear();
}
public void Remove(WebAddressConfigurationElement serviceConfig)
{
BaseRemove(serviceConfig.Name);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(string name)
{
BaseRemove(name);
}
}
}
直接把默认值做成ConfigureProperty然后根据不同的来塞数据,这样就有默认值了,Url不给也能自动配置。
<configuration>
<configSections>
<section name="casClientConfig" type="DotNetCasClient.Configuration.CasClientConfiguration, DotNetCasClient" />
<section name="WebAdresssConfiguration" type="Com.Centaline.Framework.Kernel.Config.WebAdresssConfiguration, Com.Centaline.Framework.Kernel"/>
</configSections>
<WebAdresssConfiguration>
<WebAddresss>
<WebAddress Name="FindOrgZTreeList" Url="http://uam.centaline.com:8081/aist-uam-web/rest/userOrgRest/findOrgZTreeList.json?parentId={0}" Type="Organization" />
<WebAddress Name="HasPermission" Url="http://uam.centaline.com:8081/aist-uam-web/rest/permission/hasPermission.json?jobId={0}&resourceCode={1}" Type="Permission" />
</WebAddresss>
</WebAdresssConfiguration>
其实codeproject上也早有介绍,发觉牛人真多
https://www.codeproject.com/articles/20548/creating-a-custom-configuration-section-in-c