2009-06-12 54 views
1

我在这里搜索答案。我很抱歉,如果之前已经问过这个问题(因为我怀疑它有问题)。在不重复属性名称的情况下强类型地调用web.config?

摘要:如何在不重复属性名称的情况下将强制类型的调用输入到web.config中?


详情:在我的代码,我尽量减少串的用法,我不喜欢定义两次东西。

对这两个问题的补充是我将AppSettings的使用(及其字符串)限制在一个类中,我在整个项目中引用该类。在AppSettings的类公开公共属性:

12 public static string DateFormatString { 
    13  get { 
    14   return ConfigurationManager.AppSettings["DateFormatString"]; 
    15  } 
    16 } 

我怎样才能保持这个类和防止财产重名(线12 & 14)?

或者,您还可以推荐哪些其他解决方案?

回答

0

我可能会建议反序列化的web.config成一个对象。然后,您可以访问所有的配置条目,如果他们的属性(不能比这更强类型!)

+0

这是如何符合我的需要强类型?我会反序列化什么对象类型? – lance 2009-06-12 19:52:44

0

一种解决方案可能是,

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. 
    } 
} 

调用代码看起来像,

上述方法提供了一定程度的强类型输入,但您仍然必须确保配置文件中的设置名称与该枚举的名称匹配。

最好的选择是根据配置文件自动生成类。


,如果你想强类型的属性,你可以写

public static string DateFormatString 
{ 
    get { return ConfigurationHelper.Get<string>(Settings.DateFormatString); } 
} 

此外,我会建议对阅读构造函数中的配置文件(过早的优化?)。如果您在构造函数中读取配置文件,这意味着您在应用程序运行时无法更改配置文件。

0

我创建了一个不属于我的东西的包装器。这包括缓存,会话,配置,外部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; 
     } 
    } 
} 

在这里你可以做的不仅仅是从配置文件中获取值。您可以将字符串转换为所需的类型。您可以使用该字符串来确定要返回的枚举值。等等,但关键是可以在这里进行任何有关配置的变化。要包括是否要换出配置存储的机制!

0

构建自己的ConfigurationSectionConfiguration Section Designer,这样你就不必使用AppSettings在所有...但你有你自己的设置集合,甚至将智能感知在web.config文件。

1

您的示例中没有重复:一个DateFormatString是属性名称,另一个是字符串。您只需遵循一个约定,该约定将该属性与该值的查找键相同地命名。

我确实看到了一种可能的改进。您应该在静态构造函数中读取配置文件一次并存储值,而不是每次访问属性时从AppSettings读取它们。

+0

关于曾经/构造函数的好处。关于“不重复”,当我重命名web.config中的某个属性时,我不想在两处编辑代码。 – lance 2009-06-12 19:44:12

相关问题