簡易項(xiàng)目搭建(用于一般雜七雜八的小功能點(diǎn))

在工作過程中穆端,我們總會(huì)碰到很多小型的功能點(diǎn)需要完成,以LZ自己的工作情況來舉例仿便,其中最頻繁的是倆點(diǎn)
1体啰、控制臺項(xiàng)目
2、web界面(純前臺)

控制臺項(xiàng)目

我們首先來談控制臺項(xiàng)目的工作內(nèi)容探越,在沒有使用postMan地址詳見之前狡赐,工作中使用大量的接口調(diào)用,在項(xiàng)目準(zhǔn)備階段钦幔,首先要對接口的使用進(jìn)行一個(gè)描述枕屉,在使用WebService和Wcf為主的服務(wù)接口為主的公司,使用Vs直接 <新建控制吧><添加服務(wù)引用>一套可視化的操作即可按接口通過代理類的方法進(jìn)行引用鲤氢,實(shí)在是c#開發(fā)的樂趣所在搀擂。
廢話不多說西潘,現(xiàn)在主要說說工作中常用的功能點(diǎn)
1、測試服務(wù)接口
2哨颂、編寫windows服務(wù)

服務(wù)接口

控制臺項(xiàng)目完成此功能很簡單喷市,本文章主要突出的是一些常用的方法。
在編寫類項(xiàng)目的過程中威恼,主要會(huì)用到三個(gè)類庫
1.Newtonsoftjson(json序列化)
2.log4net(日志記錄)
3.NUint(單元測試)

業(yè)務(wù)上無非就是調(diào)用接口測試品姓,如果成功Pass,如果失敗記錄日志箫措。
單元測試的目的主要是為了腹备,批量使用接口,測試接口的并發(fā)和其他操作所用

Windows服務(wù)

windows服務(wù)的使用場景在我的工作中主要結(jié)合任務(wù)調(diào)度來來做斤蔓,同時(shí)配合一些其他的技術(shù)植酥,像是隊(duì)列,緩存等
例子:
1弦牡、每隔10秒同步一次A數(shù)據(jù)庫數(shù)據(jù)(SqlServer)至B數(shù)據(jù)庫(Oracle),表名稱友驮,字段名稱均不一樣
2、每天凌晨2點(diǎn)跑一項(xiàng)或多項(xiàng)任務(wù)驾锰,成功失敗均記錄日志+推送管理員(手機(jī)短信卸留、郵件、內(nèi)部服務(wù)平臺)

大體上都是結(jié)合任務(wù)調(diào)度來做的稻据,進(jìn)行任務(wù)調(diào)試的庫一般選用的是Quartz.Net,console服務(wù)轉(zhuǎn)Windows服務(wù)用的是topshelf,日志使用Log4net
通過這三個(gè)組件就能夠滿足我的一般需求艾猜,其他的功能點(diǎn)按要求要引用不同的類庫。

簡單項(xiàng)目搭建

項(xiàng)目搭建1.0

新建一個(gè)console 項(xiàng)目捻悯,運(yùn)行環(huán)境選擇.Net Framework 4.5

新建解決方案

建立三個(gè)類庫
Common 基礎(chǔ)層
Models 實(shí)體層
ScheduleTasks 任務(wù)具體任務(wù)

結(jié)構(gòu)圖.png

首先引用Nuget包,不同的層引用不同的Nuget,再次簡單說明
Common 基礎(chǔ)層

log4net甩骏、quartz.net

Models 實(shí)體層

Sqlsugar

Schedules

待定

進(jìn)行不同的模塊封裝

log4net 的引用和封裝

log4Net不需要做太多的封裝族吻,提供一個(gè)初始化,一個(gè)日志接口獲取方法即可

    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="時(shí)間:%date 級別:%-5level 日志記錄器:%logger%n內(nèi)容:%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//"/>
      <!--記錄日志寫入文件時(shí),不鎖定文本文件外厂,防止多線程時(shí)不能寫Log,官方說線程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--最多產(chǎn)生的日志文件數(shù)泽台,超過則只保留最新的n個(gè)莽龟。設(shè)定值value="-1"為不限文件數(shù)-->
      <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;" />
      <!--按照何種方式產(chǎn)生多個(gè)日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <param name= "RollingStyle" value= "Composite"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%n時(shí)間:%d [%t] %n級別:%-5p %n位置:[%thread] (%file:%line) %n消息描述:%message%n異常:%exception%n%n " />
      </layout>
    </appender>

    <!--root節(jié)點(diǎn)的作用是所有其它logger都默認(rèn)繼承它岁经。-->
    <root>
      <!--配置日志的級別,低于此級別的就不寫到日志里面去-->
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="ALL" />
      <!--啟用日志輸入到控制臺-->
      <appender-ref ref="Console"/>
      <appender-ref ref="LogByDate"/>
    </root>
  </log4net>
</configuration>

至此log4net的工作完成

Newtonsoftjson

image.png

版本隨便你自己使用

在程序的編碼過程中經(jīng)常會(huì)用到j(luò)son的序列化和么序列化
編寫一個(gè)簡單的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字符串生成對象實(shí)體
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子兒"})</param>
        /// <returns>對象實(shí)體</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數(shù)組生成對象實(shí)體集合
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="json">json數(shù)組字符串(eg.[{"ID":"112","Name":"石子兒"}])</param>
        /// <returns>對象實(shí)體集合</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;
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末何荚,一起剝皮案震驚了整個(gè)濱河市囱淋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌餐塘,老刑警劉巖妥衣,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡税手,警方通過查閱死者的電腦和手機(jī)蜂筹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芦倒,“玉大人艺挪,你說我怎么就攤上這事”铮” “怎么了麻裳?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長周霉。 經(jīng)常有香客問我掂器,道長,這世上最難降的妖魔是什么俱箱? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮灭必,結(jié)果婚禮上狞谱,老公的妹妹穿的比我還像新娘。我一直安慰自己禁漓,他們只是感情好跟衅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著播歼,像睡著了一般伶跷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秘狞,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天叭莫,我揣著相機(jī)與錄音,去河邊找鬼烁试。 笑死雇初,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的减响。 我是一名探鬼主播靖诗,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼支示!你這毒婦竟也來了刊橘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颂鸿,失蹤者是張志新(化名)和其女友劉穎促绵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞愚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年叙甸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片位衩。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裆蒸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糖驴,到底是詐尸還是另有隱情僚祷,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布贮缕,位于F島的核電站辙谜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏感昼。R本人自食惡果不足惜装哆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望定嗓。 院中可真熱鬧蜕琴,春花似錦、人聲如沸宵溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恃逻。三九已至雏搂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寇损,已是汗流浹背凸郑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留润绵,地道東北人线椰。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像尘盼,于是被迫代替她去往敵國和親憨愉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容