zoukankan      html  css  js  c++  java
  • 避免在代码中直接任意使用ConfigurationManager.AppSettings

    ConfigurationManager.AppSettings可以很方便的获取应用程序配置文件中的内容,如Web.Config。这也导致了在代码中,经常能看见对ConfigurationManager.AppSettings的随意调用。

    我们不能假设配置总是正确的,假设配置项是一定存在的,配置项的值一定是正确的。因为手工编辑配置文件,本身没有有效的验证机制,全靠人员自己掌控。当这种不可靠的假设不成立的时候,ConfigurationManager.AppSettings不会给你一个准确的参考。如下面这行代码:

    1
    int MarginX = int.Parse(ConfigurationManager.AppSettings["MarginX"]);

     如果没有配置MarginX的话,会得到一个ArgumentNullException;如MarginX配置的不是一个数字,会得到一个ArgumentException。这时也不要假设能很快地定位到问题所在,在日志中看到这样的Exception,是不会明白其实这是一个简单的配置错误;也不是什么环境下都能让我们去debug,打个断点就能跟踪进去。所以我们可以对这种操作进行封装一下:

    1
    2
    3
    4
    5
    6
    public class ConfigSetting
    {
        public static int GetMarginX()
        {
            return GetIntAppSettings("MarginX");
        }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        private static String GetStringAppSettings(string name)
        {
          if (string.IsNullOrEmpty(ConfigurationManager.AppSettings[name]))
          {
            throw new ConfigurationErrorsException(string.Format("Missing ConfigSetting "{0}"", name));
          }
          return ConfigurationManager.AppSettings[name];
        }
     
        private static int GetIntAppSettings(string name)
        {
          string value = GetStringAppSettings(name);
          int result = 0;
          if (!Int32.TryParse(value, out result))
          {
            throw new ConfigurationErrorsException(string.Format("Invalid value in ConfigSetting "{0}"", name));
          }
          return result;
        }
    }
     这样,我们就能得到比较清楚的错误提示了。

    此外,类不应依赖配置项。在类中处处调用ConfigurationManager.AppSettings,会导致类对配置文件的依赖。比如写单元测试代码时,又得去维护一个配置文件。其实配置项大多配置的是某个对象的属性默认值。我们应该用一个配置类或接口读取配置项值,再注入到要使用配置项的类中。至于采取构造注入,属性注入还是方法注入,就看具体情况了。普通类最好也不要去依赖配置类或配置接口,这种依赖也无太多业务意义。

  • 相关阅读:
    linux命令行下命令参数前的一横(-)和两横(--)的区别
    sql的集合操作
    二叉树的遍历
    linux网络编程中阻塞和非阻塞socket的区别
    Python 信号量
    python中文件的复制
    Linux网络服务器epoll模型的socket通讯的实现(一)
    Linux启动提示“unexpected inconsistency;RUN fsck MANUALLY”
    Linux用户级线程和内核级线程区别
    nodejs的cs模式聊天客户端和服务器实现
  • 原文地址:https://www.cnblogs.com/henhaoji/p/3232630.html
Copyright © 2011-2022 走看看