【发布时间】:2014-03-01 23:58:07
【问题描述】:
我有自定义配置部分,例如
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="DBConfiguration" type="NewSQLExecuter.DBConfigurationSection, NewSQLExecuter"/>
</configSections>
<DBConfiguration>
<Items>
<add servername="192.168.50.2\db1" dbname="test1" userid="sa" password="2222m@n" countrycode="GB" />
<add servername="192.168.60.2\db2" dbname="test2" userid="sa" password="22222n" countrycode="US" />
<add servername="192.168.70.2\db3" dbname="test3" userid="sa" password="3333" countrycode="DE" />
</Items>
</DBConfiguration>
</configuration>
我已经编写了一个从自定义配置部分读取数据的类...类代码如下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
namespace NewSQLExecuter
{
public class DBConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("Items")]
public ItemsCollection Items
{
get { return ((ItemsCollection)(base["Items"])); }
}
}
[ConfigurationCollection(typeof(ItemsElement))]
public class ItemsCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ItemsElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ItemsElement)(element)).CountryCode;
}
public ItemsElement this[int idx]
{
get
{
return (ItemsElement)BaseGet(idx);
}
}
}
public class ItemsElement : ConfigurationElement
{
[ConfigurationProperty("servername", DefaultValue = "", IsKey = false, IsRequired = false)]
public string ServerName
{
get
{
return ((string)(base["servername"]));
}
set
{
base["servername"] = value;
}
}
[ConfigurationProperty("dbname", DefaultValue = "", IsKey = false, IsRequired = false)]
public string DBName
{
get
{
return ((string)(base["dbname"]));
}
set
{
base["dbname"] = value;
}
}
[ConfigurationProperty("userid", DefaultValue = "", IsKey = false, IsRequired = false)]
public string UserID
{
get
{
return ((string)(base["userid"]));
}
set
{
base["userid"] = value;
}
}
[ConfigurationProperty("password", DefaultValue = "", IsKey = false, IsRequired = false)]
public string Password
{
get
{
return ((string)(base["password"]));
}
set
{
base["password"] = value;
}
}
[ConfigurationProperty("countrycode", DefaultValue = "", IsKey = true, IsRequired = true)]
public string CountryCode
{
get
{
return ((string)(base["countrycode"]));
}
set
{
base["countrycode"] = value;
}
}
}
}
这样我迭代自定义配置数据并获取值
DBConfigurationSection section = (DBConfigurationSection)ConfigurationManager.GetSection("DBConfiguration");
if (section != null)
{
DateTime satrt = DateTime.Now;
for (int i = 0; i <= section.Items.Count - 1; i++)
{
var country = section.Items[i].CountryCode; ;
var constring = string.Format("{0}{1}{2}{3}", "UID=" + section.Items[i].UserID, ";PWD=" + section.Items[i].Password,
";Server=" + section.Items[i].ServerName, ";Database=" + section.Items[i].DBName);
dicList.Add(country, constring);
}
}
代码运行良好,但我想再添加一项功能,例如通过任何键值搜索任何配置数据,例如
if(section.key.userid=="joy")
{
string pwd=section.key.password
}
所以请指导我如何将搜索功能添加到我的课程中。如果我可以使用 LINQ 搜索任何自定义配置数据,那就太好了。所以请指导我谢谢。
在 app.config 文件中处理两个自定义配置部分时出错
我的 app.config 文件看起来像
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="DBConfiguration" type="CSRAssistant.DBConfigurationSection, CSRAssistant"/>
<section name="LoginConfiguration" type="CSRAssistant.LoginConfigurationSection, CSRAssistant"/>
</configSections>
<DBConfiguration>
<add servername="dbname" dbname="BBAJobBoardForGB" userid="sa" password="222" countrycode="GBR" />
<add servername="db2" dbname="BBAJobBoardForUS" userid="sa" password="swww" countrycode="USA" />
</DBConfiguration>
<LoginConfiguration>
<add UserName="ww" Pwd="ww" Country="GBR"/>
<add UserName="ss" Pwd="ss" Country="USA"/>
<add UserName="dd" Pwd="dd" Country="CAD"/>
</LoginConfiguration>
<appSettings>
<add key="MailID" value="tridip@bba-reman.com" />
</appSettings>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<requiredRuntime version="v4.0.20506"/>
</startup>
</configuration>
要处理两个部分,我的代码如下
namespace CSRAssistant
{
public class DBConfigurationSection : ConfigurationSection
{
//[ConfigurationProperty("Items")]
//public ItemsCollection Items
//{
// get { return ((ItemsCollection)(base["Items"])); }
//}
[ConfigurationProperty("", IsDefaultCollection = true)]
public ItemsCollection Items
{
get
{
return ((ItemsCollection)(base[""]));
}
}
}
[ConfigurationCollection(typeof(ItemsElement))]
public class ItemsCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ItemsElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ItemsElement)(element)).CountryCode;
}
public ItemsElement this[int idx]
{
get
{
return (ItemsElement)BaseGet(idx);
}
}
}
public class ItemsElement : ConfigurationElement
{
[ConfigurationProperty("servername", DefaultValue = "", IsKey = false, IsRequired = false)]
public string ServerName
{
get
{
return ((string)(base["servername"]));
}
set
{
base["servername"] = value;
}
}
[ConfigurationProperty("dbname", DefaultValue = "", IsKey = false, IsRequired = false)]
public string DBName
{
get
{
return ((string)(base["dbname"]));
}
set
{
base["dbname"] = value;
}
}
[ConfigurationProperty("userid", DefaultValue = "", IsKey = false, IsRequired = false)]
public string UserID
{
get
{
return ((string)(base["userid"]));
}
set
{
base["userid"] = value;
}
}
[ConfigurationProperty("password", DefaultValue = "", IsKey = false, IsRequired = false)]
public string Password
{
get
{
return ((string)(base["password"]));
}
set
{
base["password"] = value;
}
}
[ConfigurationProperty("countrycode", DefaultValue = "", IsKey = true, IsRequired = true)]
public string CountryCode
{
get
{
return ((string)(base["countrycode"]));
}
set
{
base["countrycode"] = value;
}
}
}
public class LoginConfigurationSection : ConfigurationSection
{
//[ConfigurationProperty("Items")]
//public ItemsCollection Items
//{
// get { return ((ItemsCollection)(base["Items"])); }
//}
[ConfigurationProperty("", IsDefaultCollection = true)]
public ItemsCollection Items
{
get
{
return ((ItemsCollection)(base[""]));
}
}
}
public class LoginElement : ConfigurationElement
{
[ConfigurationProperty("UserName", DefaultValue = "", IsKey = false, IsRequired = false)]
public string UserName
{
get
{
return ((string)(base["UserName"]));
}
set
{
base["UserName"] = value;
}
}
[ConfigurationProperty("Pwd", DefaultValue = "", IsKey = false, IsRequired = false)]
public string Pwd
{
get
{
return ((string)(base["Pwd"]));
}
set
{
base["Pwd"] = value;
}
}
[ConfigurationProperty("Country", DefaultValue = "", IsKey = false, IsRequired = false)]
public string Country
{
get
{
return ((string)(base["Country"]));
}
set
{
base["Country"] = value;
}
}
}
}
这样读取两个自定义配置设置
string joyPassword = "";
LoginConfigurationSection LoginConfigurationSection = (LoginConfigurationSection)ConfigurationManager.GetSection("LoginConfiguration");
if (LoginConfigurationSection != null)
{
var UserCredentials = LoginConfigurationSection.Items
.Cast<LoginElement>()
.FirstOrDefault(_element => _element.UserName == "razi");
if (UserCredentials != null)
joyPassword = UserCredentials.Country;
DBConfigurationSection section = (DBConfigurationSection)ConfigurationManager.GetSection("DBConfiguration");
if (section != null)
{
var DbConnection = section.Items
.Cast<ItemsElement>()
.FirstOrDefault(_element => _element.CountryCode.ToUpper() == joyPassword.ToUpper());
if (DbConnection != null)
joyPassword = DbConnection.ServerName;
}
}
现在我在运行时遇到错误 无法识别的属性“用户名”。请注意,属性名称区分大小写。
为什么无法识别的属性“用户名”只是不明白....如果可能,请指导我。谢谢
【问题讨论】:
-
我知道这不是您正在寻找的答案,但您为什么不直接将配置文件作为 xml 读取呢?我的意思是这样做要容易得多,使用 XDocument 你可以找到任何东西。
-
@Alex 我不同意这一点。我认为自定义配置系统比加载随机xml文件更友好,更容易使用。它集成在 app/web.config 工作流程中并且可以以标准方式加载并且仍然通过
configSource包含在外部文件中的事实是一个杀手级功能。在我看来,他的示例非常适合自定义部分,我也会这样做。 -
鉴于这个问题,在我看来,OP 正在为一些 LINQ 功能而死。因此,将所有内容加载到 XDoc 中,然后使用 foo = 'bar' 获取孩子似乎是一笔不错的交易。同样,这只是一种观点,就工作流程而言,我同意你的看法。是搜索部分吸收了自定义配置。
-
@Alex 我相信这与我建议使用 linq 搜索项目并没有太大不同。请注意,由于项目集合仍然是
IEnumerable,因此您可以相对轻松地在其上使用 linq。即使您采用纯 XML 路线,我仍然建议使用类型化模型并将 xml 反序列化到其中。无论如何,它最终会与配置部分非常相似,就像我之前所说的那样,它会与默认工作流程断开连接。我同意虽然配置部分并不总是答案,例如如果您已经拥有 xml 和模型。 -
如果有人使用模型:) ...我很少为这类事情做。因此,配置类的额外麻烦使它成为一个更加麻烦的解决方案。但你是对的,从长远来看,配置类是最好的方法。对于非懒惰的开发者来说。
标签: c# linq custom-configuration