簡易項目搭建(用於一般雜七雜八的小功能點)

在工作過程中,我們總會碰到很多小型的功能點需要完成,以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日誌配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <!-- 控制檯前臺顯示日誌 -->
    <appender name="Console" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="DEBUG" />
        <foreColor value="White" />
      </mapping>
      <mapping>
        <level value="INFO" />
        <foreColor value="Blue" />
      </mapping>
      <mapping>
        <level value="WARN" />
        <foreColor value="Yellow" />
      </mapping>
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="時間:%date 級別:%-5level 日誌記錄器:%logger%n內容:%message%n%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>

    <appender name="LogByDate" type="log4net.Appender.RollingFileAppender">
      <!--日誌路徑-->
      <param name= "File" value= "Log//"/>
      <!--記錄日誌寫入文件時,不鎖定文本文件,防止多線程時不能寫Log,官方說線程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--是否是向文件中追加日誌-->
      <param name= "AppendToFile" value= "true"/>
      <!--最多產生的日誌文件數,超過則只保留最新的n個。設定值value="-1"爲不限文件數-->
      <param name= "MaxSizeRollBackups" value= "-1"/>
      <param name="MaximumFileSize" value="10MB" />
      <!--日誌文件名是否是固定不變的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--固定後綴-->
      <PreserveLogFileNameExtension value="true" />
      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;" />
      <!--按照何種方式產生多個日誌文件(日期[Date],文件大小[Size],混合[Composite])-->
      <param name= "RollingStyle" value= "Composite"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%n時間:%d [%t] %n級別:%-5p %n位置:[%thread] (%file:%line) %n消息描述:%message%n異常:%exception%n%n " />
      </layout>
    </appender>

    <!--root節點的作用是所有其它logger都默認繼承它。-->
    <root>
      <!--配置日誌的級別,低於此級別的就不寫到日誌裏面去-->
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="ALL" />
      <!--啓用日誌輸入到控制檯-->
      <appender-ref ref="Console"/>
      <appender-ref ref="LogByDate"/>
    </root>
  </log4net>
</configuration>

至此log4net的工作完成

Newtonsoftjson


版本隨便你自己使用

在程序的編碼過程中經常會用到json的序列化和麼序列化
編寫一個簡單的help class

    /// <summary>
    /// Json幫助類
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// 將對象序列化爲JSON格式
        /// </summary>
        /// <param name="o">對象</param>
        /// <returns>json字符串</returns>
        public static string SerializeObject(object o)
        {
            string json = JsonConvert.SerializeObject(o);
            return json;
        }

        /// <summary>
        /// 解析JSON字符串生成對象實體
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子兒"})</param>
        /// <returns>對象實體</returns>
        public static T DeserializeJsonToObject<T>(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;
        }

        /// <summary>
        /// 解析JSON數組生成對象實體集合
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="json">json數組字符串(eg.[{"ID":"112","Name":"石子兒"}])</param>
        /// <returns>對象實體集合</returns>
        public static List<T> DeserializeJsonToList<T>(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
            List<T> list = o as List<T>;
            return list;
        }

        /// <summary>
        /// 反序列化JSON到給定的匿名對象.
        /// </summary>
        /// <typeparam name="T">匿名對象類型</typeparam>
        /// <param name="json">json字符串</param>
        /// <param name="anonymousTypeObject">匿名對象</param>
        /// <returns>匿名對象</returns>
        public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
        {
            T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
            return t;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章