【G】開源的分散式部署解決方案(二) - 好項目是從爛項目基礎上重構出來的

来源:http://www.cnblogs.com/doddgu/archive/2017/01/24/g_2.html
-Advertisement-
Play Games

G.系列導航 【G】開源的分散式部署解決方案 - 預告篇 【G】開源的分散式部署解決方案(一) - 開篇 【G】開源的分散式部署解決方案(二) - 好項目是從爛項目基礎上重構出來的 分析目前項目結構 眼前出現這麼一坨坨的文件夾,相信很多人已經看不下去了。是的,首先就是要把它給做掉。 按照這個項目文件 ...


G.系列導航

【G】開源的分散式部署解決方案 - 預告篇

【G】開源的分散式部署解決方案(一) - 開篇

【G】開源的分散式部署解決方案(二) - 好項目是從爛項目基礎上重構出來的

分析目前項目結構

 

眼前出現這麼一坨坨的文件夾,相信很多人已經看不下去了。是的,首先就是要把它給做掉。

按照這個項目文件夾的命名意圖,大概可以劃分如下:

1.Business:業務代碼

2.Data:數據訪問

3.Helpers:輔助類(通用類庫之類的)

4.Models:各種模型(包括視圖模型)

5.theme:皮膚,還有一些content、scripts之類的應該是要刪除或整理到theme中。

6.Controller、Views、DB:這些就先不動他了。

 

按文件夾名的意圖重新整理項目結構

 

首先整理出4個解決方案文件夾(註:解決方案文件夾是個虛擬的結構,並非真實的物理文件夾,雖然源碼存放位置也缺失按照目前分層做的,但這個概念要分開),分別是 Business、Model、Data、Infrastructure,將業務、模型、數據、基礎設施給分拆出來。

其中Business、Model兩個文件夾主要與業務相關,這兩個文件夾會根據功能模塊創建對應的項目,比如 DeployManage、UserManage等。像部署下的一些小的概念,如部署伺服器、部署伺服器組、部署項目等這些只需要在對應項目下創建1級文件夾區分開即可。

而Data下拆分為2個,主要考慮到 Wrapper 是給Business用的,主要用來訪問資料庫,而Entities則是用於存放數據表對應的實體類。

最後的Infrastructure則把一些公共的類放到了這裡。

可能有人不禁要問一下,就這麼簡單?這就是最終項目結構了嗎?

當然不是,重構即是一個動作,也是一個過程。後面會根據項目發展不斷的進行重構。 

遷移過程中遇到的問題與解決

1.李鬼李逵傻傻分不清楚

首先遇到的問題則是它,AuthenticationDescription,按照已有的命名空間引用,正常推論是只要引用 Microsoft.Owin.Security.dll 就可以了。但事實證明不行。

為了知道到底是什麼原因,我又把這個類放回原來的位置,F12跟蹤進去一看,嘿,原來是個李鬼裝李逵。

最終通過添加了Microsoft.Owin.dll 解決,這個類其實跟Microsoft.Owin.Security.dll沒關係的。真真是被戲耍了一番。

2.雷鋒,你做了好事倒是留個名啊

 

大家可能比較喜歡使用vs自帶的這個小燈泡,是的它很方便,但它不是萬能的。如果你按照這裡的選項來做你有2個選擇,要麼新建一個類自己實現,要麼引用 System.Runtime.Remoting.Context

雖然通過上面的辦法我們也能找到最終是誰做的好事,但這個時候經驗出現了,我一眼就看出來這是EF幫忙擴展了的(畢竟踩的坑多)。它做了好事兒,但它還沒留下自己的名字,只告訴我它是個無名氏。當初第一次踩這個坑也是通過第一個方法解決的,性質跟是一樣的,但這裡想告訴大家,積累也很重要。

當處理到Business的時候,發現它終於可以給一個正確的提示了,這就好像A是B的老婆,B是C的同事,C認識B自然問B就知道A是誰了。

3.你女兒嫁人了她還是你女兒啊

 

把引用關係都改好了,過程中修改名字也都使用了大家喜歡的小燈泡同時更改所有的引用,為什麼還會出現這個問題?難道View你就不管了嗎?她不是你生的?

就是這個潑出去的水,你生的還要我來擦屁股。這裡僅僅只是吐槽罷了。

看到了這個頁面我長舒了一口氣,終於是不報錯了。

再來看下 G.Client.UI.Admin 好像是順眼多了。

但這就改完了嗎?這隻是個開始而已,後面的路還長呢。

4.青春痘長在別人臉上你最不擔心?

 

好好的一個業務層代碼,引用了EF,著實是不爽。不僅如此,Model里也引用了System.Web來獲取UserID。

作為一個有道德的人,別人臉上長了青春痘,你應該拿個揚聲器對著他喊:喂,你臉上有青春痘,好大一顆,好難看!

nonono,作為一個有文化的人,我當然會解決你的痛處。而不是現在,後面一定會做的。其實很簡單,只需要在Wrapper里封裝好EF的操作,讓Business不會直接引用到EF相關的功能即可。(這個是.net的機制不深究了)

同樣的,System.Web的也通過Infrastructure里提供就好了。從此再也不擔心青春痘亂長了。 

代碼方面的調整

作為一個懶人,第一個要解決的肯定是解放雙手。

後面對資料庫操作的還有好多地方,到處都要這樣賦值真的是心疼自己細白嫩長的五指。

已經有很多人想到了AutoMapper吧?當然也有人喜歡EmitMapper等等。各有所長,蘿蔔白菜自己挑一個啃了吧。用法我就不多說了,看個最終代碼。當然我用的是自己又封裝一次的AutoMapper。

即便AutoMapper已經很靈活了,但每個人的習慣不同,總有你覺得不爽的地方,那就自己動手吧。

嘖嘖嘖,瞬間又順眼了好多,整個人都好了。

PS:這次引用的Mapper是我們自己寫的,Framework.Mapping和Framework.Caching。暫時還沒有開源,後面會放出來,其實也沒加殼混淆,你有興趣肯定難不住你的。

 

下一篇預告:【G】開源的分散式部署解決方案(三) -  部署項目管理(以Jenkins為例,準備好部署文件包)

最後最後,本項目暫定名為 G,唯一群號:7424099

Git地址:http://git.oschina.net/doddgu/G   (希望大家可以順手點個star,感謝各位的支持)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQLite什麼都好,就怕“database is locked”這些年來想盡辦法去規避它。測試代碼: static void Test2() { XCode.Setting.Current.TransactionDebug = true; XTrace.WriteLine(Role.Meta.Co ...
  • 環境:Abp1.2 疑問:沒有調用工作單元的SaveChanges方法引起的事務提交時機的問題. 例如:有一個應用服務代碼如下: 根據用戶提交數據插入一條記錄,但在方法末未顯式調用SaveChanges方法 在Mvc的Controller里調用上述方法的代碼如下: 在_phraseAppServic ...
  • Forms認證即是表單認證,需提供身份id和密碼password的進行認證和授權管理。應該是大家比較熟悉的一種,剛接觸.net可能都會學學這個東西。 ...
  • 前言: 我們在很多項目場景中使用對象映射工具,那麼使用最多的OOM對象工具也就那幾個。今天所說的EmitMapper 和TinyMapper 兩者的性能都是很高的,相比autoMapper 速度不知道快了多少倍,因為我平時使用的最多EmitMapper,所在業餘時間做了一下測試兩者對比。 測試數據: ...
  • 在微信支付中,當用戶支付成功後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。 在經歷了千幸萬苦之,填完了所有的JSAPI支付的坑後(微信JSAPI支付 跟 所遇到的那些坑),好不容易調起了微信支付介面,看到了親愛的支付頁面,支付成功後發現自己還有個叫做微信回調的忘了處理, ...
  • 1、Main函數是什麼?在程式中使用Main函數有什麼需要註意的地方? Q:程式的入口函數,函數名稱不能改變;一個程式有且只有一個Main函數。 2、面向對象的三大特征是什麼? Q:封裝,繼承,多態。 3、值類型預設值是什麼? Q:隔天公佈。 ...
  • 本文彙總了C#啟動外部程式的幾種常用方法,非常具有實用價值,主要包括如下幾種方法: 1. 啟動外部程式,不等待其退出。 2. 啟動外部程式,等待其退出。 3. 啟動外部程式,無限等待其退出。 4. 啟動外部程式,通過事件監視其退出。 c#使用process.start啟動程式報錯解決方法 ...
  • 1 不跟你多廢話 上代碼! /// <summary> /// SQL關鍵字轉換器 /// </summary> public class SqlConverter : IKeywordsConvertible { public SqlConverter(string[] keywords) { K ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...