Bootstrap

c#包含日志输出的项目搭建

在工作过程中,我们总会碰到很多小型的功能点需要完成,以LZ自己的工作情况来举例,其中最频繁的是俩点

1、控制台项目

2、web界面(纯前台)

##控制台项目

我们首先来谈控制台项目的工作内容,在没有使用postMan[地址详见]()之前,工作中使用大量的接口调用,在项目准备阶段,首先要对接口的使用进行一个描述,在使用WebService和Wcf为主的服务接口为主的公司,使用Vs直接 <新建控制吧><添加服务引用>一套可视化的操作即可按接口通过代理类的方法进行引用,实在是c#开发的乐趣所在。

废话不多说,现在主要说说工作中常用的功能点

1、测试服务接口

2、编写windows服务

服务接口

控制台项目完成此功能很简单,本文章主要突出的是一些常用的方法。

在编写类项目的过程中,主要会用到三个类库

1.Newtonsoftjson(json序列化)

2.log4net(日志记录)

3.NUint(单元测试)

业务上无非就是调用接口测试,如果成功Pass,如果失败记录日志。

单元测试的目的主要是为了,批量使用接口,测试接口的并发和其他操作所用

Windows服务

windows服务的使用场景在我的工作中主要结合任务调度来来做,同时配合一些其他的技术,像是队列,缓存等

例子:

1、每隔10秒同步一次A数据库数据(SqlServer)至B数据库(Oracle),表名称,字段名称均不一样

2、每天凌晨2点跑一项或多项任务,成功失败均记录日志+推送管理员(手机短信、邮件、内部服务平台)

大体上都是结合任务调度来做的,进行任务调试的库一般选用的是Quartz.Net,console服务转Windows服务用的是topshelf,日志使用Log4net

通过这三个组件就能够满足我的一般需求,其他的功能点按要求要引用不同的类库。

##简单项目搭建

###项目搭建1.0

新建一个console 项目,运行环境选择.Net Framework 4.5

新建解决方案

>建立三个类库

Common 基础层

Models 实体层

ScheduleTasks 任务具体任务

首先引用Nuget包,不同的层引用不同的Nuget,再次简单说明

Common 基础层

>log4net、quartz.net

Models 实体层

>Sqlsugar

Schedules

>待定

进行不同的模块封装

####log4net 的引用和封装

log4Net不需要做太多的封装,提供一个初始化,一个日志接口获取方法即可

    public class LogFactory
    {
        static LogFactory()
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + @"/log4net.config";
            FileInfo configFile=new FileInfo(path);
            log4net.Config.XmlConfigurator.Configure();
        }

        public static ILog GetLogger(string name)
        {
            return LogManager.GetLogger(name);
        }

        public static ILog GetLogger(Type type)
        {
            return LogManager.GetLogger(type);
        }
    }

最简单的config日志配置



  
    

至此log4net的工作完成

Newtonsoftjson

版本随便你自己使用

在程序的编码过程中经常会用到json的序列化和么序列化

编写一个简单的help class

    /// 
    /// Json帮助类
    /// 
    public class JsonHelper
    {
        /// 
        /// 将对象序列化为JSON格式
        /// 
        /// 对象
        /// json字符串
        public static string SerializeObject(object o)
        {
            string json = JsonConvert.SerializeObject(o);
            return json;
        }

        /// 
        /// 解析JSON字符串生成对象实体
        /// 
        /// 对象类型
        /// json字符串(eg.{"ID":"112","Name":"石子儿"})
        /// 对象实体
        public static T DeserializeJsonToObject(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
            T t = o as T;
            return t;
        }

        /// 
        /// 解析JSON数组生成对象实体集合
        /// 
        /// 对象类型
        /// json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])
        /// 对象实体集合
        public static List DeserializeJsonToList(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List));
            List list = o as List;
            return list;
        }

        /// 
        /// 反序列化JSON到给定的匿名对象.
        /// 
        /// 匿名对象类型
        /// json字符串
        /// 匿名对象
        /// 匿名对象
        public static T DeserializeAnonymousType(string json, T anonymousTypeObject)
        {
            T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
            return t;
        }
    }