私人工具集1——C#自定义配置类(Config)

子曰:“工欲善其事,必先利其器

github地址:https://github.com/redAntCpp/CSharpTools

为什么要使用配置类?

在项目开发中,有许多需要用到的参数,是需要进行配置的。当然在开发的时候我们可以先写死,到了需要的时候再进行配置。我个人比较倾向于一开始使用配置。

一般配置什么?

根据项目来,通常比较多的是,配置项目的日志等级、数据库连接字段、接口地址的配置、证书地址的配置等,这样可以在不改变代码的前提下,做到更新。灵活性强。

配置类通常包括,配置接口,配置接口实现

如何实现配置类

接下来分享个人的配置类实现。(博主使用VS2019)。

在项目右键,新建文件夹,命名为Config,在文件夹右键,新增项目,选择接口类,命名为IConfig.cs。
在这里插入图片描述
按照上述的做法,再新建一个类,命名为HOTConfig.cs(HOT是我当时做的一个项目,现在随便取名即可)。
在这里插入图片描述

此时,文件夹有两个文件,一个为I开头表示接口类,里面只负责定义功能,而HOTConfig继承于IConfig,需要实现接口的所有功能。

代码展示

以配置数据库跟日志的配置为例,Iconfig.cs 可以简单这么写:

namespace HOT.Config
{
    //公共配置接口
    public interface IConfig
    {

        


        //=======【日志配置】===================================
        /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
           配置日志存放目录、日志名称
         */
        int GetLogLevel();
        string GetLogPath();
        string GetLogName();

        //=========【数据库配置】===============================
        /*sql server数据库设计(ado.net)*/

        string GetHIS_OPConnetionString();
        string GetGetDataConnetionString();

        string GetHOTConnetionString();

    }
}

在HOTConfig.cs中可以这样实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HOT.Config
{

    //生成配置类
    public class HOTConfig
    {
        private static volatile IConfig config;
        private static object syncRoot = new object();

        public static IConfig GetConfig()
        {
            if (config == null)
            {
                lock (syncRoot)
                {
                    if (config == null)
                        config = new Config();
                }
            }
            return config;
        }
    }

    //具体配置项
    public class Config : IConfig
    {
        public Config()
        {
        }



        //=======【日志配置】===================================
        /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
           4.输出所有信息
           配置日志存放目录、日志名称
         */
        public int GetLogLevel()
        {
            return 4;
        }
       //日志存放位置
        public string GetLogPath()
        {
            return @"D:\HOTLog";
        }
       //日志文本的信息
        public string GetLogName()
        {
            return "HOT";
        }


        //=========【数据库配置】===============================
        /*sql server数据库设计(ado.net)*/
        public string GetGetDataConnetionString()
        {
            //配置
            string DataSource = "192.168.x.x";
            string InitialCatalog = "GetData";
            string UserID = "x";
            string Password = "x";
            //组装
            string ConnetionString = $"Data Source = {DataSource};"
                            + $"Initial Catalog = {InitialCatalog};"
                            + $"User ID = {UserID};"
                            + $"Password = {Password};";
            return ConnetionString;
        }
        public string GetHIS_OPConnetionString()
        {
            //配置
            string DataSource = "192.168.x.x";
            string InitialCatalog = "OP";
            string UserID = "x";
            string Password = "x";
            //组装
            string ConnetionString = $"Data Source = {DataSource};"
                            + $"Initial Catalog = {InitialCatalog};"
                            + $"User ID = {UserID};"
                            + $"Password = {Password};";
            return ConnetionString;
        }

        public string GetHOTConnetionString()
        {
            //配置
            string DataSource = "192.168.x.x";
            string InitialCatalog = "x";
            string UserID = "x";
            string Password = "x";
            //组装
            string ConnetionString = $"Data Source = {DataSource};"
                            + $"Initial Catalog = {InitialCatalog};"
                            + $"User ID = {UserID};"
                            + $"Password = {Password};";
            return ConnetionString;
        }

    }




}

实战应用

我们如果是按上述的做法,我们可以只改动上述的文件,即可在所有引用此类的文件中替换。实际上,一些常变动但是又不涉及重要信息的值得设置还可以通过外部文件配置来读取(如xml、json)。如下示例:
在同项目下新增一个json文件,命名为HOTApiConfig.Json:

{
  "LogConfig": {
    "LogLevel": 4,
    "LogName": "HOTApi",
    "LogPath": "G:\\C#WorkSpace\\HOTApi\\bin"
  }
}

在HOTConfig文件中,读取里面的内容,这样就可以不打开项目的前提下修改配置:

  1. 首先下载json帮助类:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
  1. 修改构造函数
 private JObject ConfigJson;
        public Config()
        {

            try
            {
                //读取json,这个是目前在服务器上配置的,用的相对路径,也可以是绝对路径
                string HOTConfigPath = HostingEnvironment.MapPath(@"/HOTApiConfig.Json");
                // Log.AddTrack("读取配置文件的路径:HOTConfigPath:", HOTConfigPath);
                using (StreamReader file = System.IO.File.OpenText(HOTConfigPath))
                {
                    using (JsonTextReader reader = new JsonTextReader(file))
                    {
                        JObject o = (JObject)JToken.ReadFrom(reader);
                        //Log.AddTrack("读取配置文件:HOTConfig:", o.ToString());
                        ConfigJson = o;
                    }
                }
            }
            catch(Exception e)
            {
                throw e;
            }
            

        }
  1. 读取json文件的值,用来设置配置日志等级。
//=======【日志配置】===================================
       /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
          配置日志存放目录、日志名称
        */
       public int GetLogLevel()
       {

           int i = Convert.ToInt32(ConfigJson["LogConfig"]["LogLevel"]);
           return i;
          // return 4;

       }
       public string GetLogPath()
       {

           return ConfigJson["LogConfig"]["LogPath"].ToString();
          // return "D:\\API\\HOTApi";

       }

       public string GetLogName()
       {
           return ConfigJson["LogConfig"]["LogName"].ToString();//LogName
           //return "HOTApi";

       }

我在我的webapi中使用了这种配置方式
在这里插入图片描述

C#中,我们可以通过自定义异常来处理应用程序中可能出现的异常情况。自定义异常需要继承自`System.Exception`。 以下是一个简单的自定义异常的实现示例: ```csharp public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception innerException) : base(message, innerException) { } } ``` 在上面的代码中,我们定义了一个名为`MyException`的自定义异常。该继承自`System.Exception`,并提供了三个构造函数。第一个构造函数是默认的构造函数,第二个构造函数接受一个字符串参数,用于指定异常消息,第三个构造函数接受两个参数,第一个参数是异常消息,第二个参数是内部异常。 通过自定义异常,我们可以在应用程序中抛出符合我们需求的异常,这样可以更好地处理应用程序中可能出现的异常情况。以下是一个示例: ```csharp public class MyClass { public void DoSomething(int input) { if (input < 0) { throw new MyException("Input cannot be negative."); } } } class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); try { myClass.DoSomething(-1); } catch (MyException ex) { Console.WriteLine(ex.Message); } } } ``` 在上面的代码中,我们在`MyClass`的`DoSomething`方法中检查输入是否为负数,如果是负数,则抛出`MyException`异常。在`Main`方法中,我们捕获了`MyException`异常,并输出了异常消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值