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,感謝各位的支持)