我在这里搜索了答案。如果之前有人问过这件事我很抱歉(因为我怀疑它已经有了)。
摘要:如何在不重复属性名称的情况下对web.config进行强类型调用?
详细信息:在我的代码中,我尝试最小化字符串使用,我不喜欢定义两次。
补充这两个优点是我将AppSettings用法(及其字符串)限制为一个类,我在整个项目中引用它。 AppSettings类公开公共属性:
12 public static string DateFormatString {
13 get {
14 return ConfigurationManager.AppSettings["DateFormatString"];
15 }
16 }
如何保留此课程并防止属性名称的重复(第12行和第14行)?
或者,您可以推荐其他解决方案吗?
答案 0 :(得分:3)
我喜欢使用自定义配置处理程序。
http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx
答案 1 :(得分:2)
您的示例中没有重复:一个DateFormatString是属性名称,另一个是字符串。您只需遵循一个约定,该约定将该属性命名为与该值的查找键相同。
我确实看到了一个可能的改进。您应该在静态构造函数中读取配置文件一次并存储值,而不是每次访问属性时从AppSettings读取它们。
答案 2 :(得分:1)
我可能建议将web.config反序列化为一个对象。然后,您可以访问所有配置条目,就好像它们是属性一样(无法获得比这更强的类型!)
答案 3 :(得分:1)
一种解决方案可能是,
public enum Settings
{
None,
DateFormatString,
DefeaultUserPrefix,
SomeOtherValue
}
然后有一个帮助类,如
public static class ConfigurationHelper
{
public static Get<T>(Settings setting)
{
string output = ConfigurationManager.AppSettings[setting.ToString()];
if(string.isNullOrEmpty(output))
throw new ConfigurationErrorsException("Setting " + setting + " is not defined in Configuration file.");
return (T)output; //You can probably use Convert.* functions.
}
}
您的通话代码如下,
ConfigurationHelper.Get<string>(Settings.DateFormatString);
上述方法提供了一定程度的强类型,但您仍需确保配置文件中的设置名称与枚举名称匹配。
最好的选择是根据配置文件自动生成类。
如果您想要强类型属性,可以编写
public static string DateFormatString
{
get { return ConfigurationHelper.Get<string>(Settings.DateFormatString); }
}
另外,我建议不要在构造函数中读取配置文件(过早优化?)。如果您在构造函数中读取配置文件,则意味着在应用程序运行时无法更改配置文件。
答案 4 :(得分:1)
我为所有不属于我的东西创建了一个包装器。这包括缓存,会话,配置,外部Web服务等。这允许我封装使用该窗口小部件的脏细节。在配置的情况下,我有一个裸骨配置类,它暴露了我的app.config或web.config所包含的各种属性。这可能看起来像这样:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using RanchBuddy.Core.Services.Impl;
using StructureMap;
namespace RanchBuddy.Core.Services.Impl
{
[Pluggable("Default")]
public class ConfigurationService : IConfigurationService
{
internal static int GetDefaultCacheDuration_Days()
{
return Convert.ToInt32(ConfigurationManager.AppSettings["DefaultCacheDuration_Days"]);
}
...
internal static LoggingType GetLoggingType()
{
string loggingType = ConfigurationManager.AppSettings["LoggingType"].ToString();
if(loggingType.ToLower() == "verbose")
{
return LoggingType.Verbose;
}
else if (loggingType.ToLower() == "error")
{
return LoggingType.Error;
}
return LoggingType.Error;
}
...
public static string GetRoot()
{
string result = "";
if(ConfigurationManager.AppSettings["Root"] != null)
{
result = ConfigurationManager.AppSettings["Root"].ToString();
}
return result;
}
}
}
在这里,您可以做的不仅仅是从配置文件中获取值。您可以将字符串转换为它需要的类型。您可以使用该字符串来确定要返回的枚举值。等等。但关键是,可以在此处进行有关配置的任何更改。要包括是否要替换配置存储的机制!
答案 5 :(得分:1)
使用Configuration Section Designer构建您自己的ConfigurationSection
,这样您根本不必使用AppSettings
...但是您将拥有自己的设置集合甚至在web.config
文件中都有Intellisense。
答案 6 :(得分:1)
我写了nuget package来做这件事(除此之外)。 accompanying blog post会详细介绍,但这个简化的代码段显示了与您的问题相关的要点。
public string DateFormatString =>
ConfigurationManager.AppSettings[MethodBase.GetCurrentMethod().Name.Replace("get_", "")];