对web.config进行强类型调用而不重复属性名称?

时间:2009-06-12 18:56:40

标签: c# asp.net refactoring string strong-typing

我在这里搜索了答案。如果之前有人问过这件事我很抱歉(因为我怀疑它已经有了)。

摘要:如何在不重复属性名称的情况下对web.config进行强类型调用?


详细信息:在我的代码中,我尝试最小化字符串使用,我不喜欢定义两次。

补充这两个优点是我将AppSettings用法(及其字符串)限制为一个类,我在整个项目中引用它。 AppSettings类公开公共属性:

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

如何保留此课程并防止属性名称的重复(第12行和第14行)?

或者,您可以推荐其他解决方案吗?

7 个答案:

答案 0 :(得分:3)

答案 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_", "")];