今年年初進了一家新公司,進入之後一邊維護老項目一邊瞭解項目流程,為了接下來的項目重做積累點經驗。 先說下老項目吧,.net fx 3.5+oracle...... 在實際維護中逐漸發現,老項目有標準版、定製版兩種,標準版就是一套代碼,粗略計算了下,全部版本加起來有20+個版本,如果項目重做後還是依照 ...
今年年初進了一家新公司,進入之後一邊維護老項目一邊瞭解項目流程,為了接下來的項目重做積累點經驗。
先說下老項目吧,.net fx 3.5+oracle......
在實際維護中逐漸發現,老項目有標準版、定製版兩種,標準版就是一套代碼,粗略計算了下,全部版本加起來有20+個版本,如果項目重做後還是依照這個模式去開發維護,估計距離猝死也不遠了,並且不同版本代碼的復用率極低(好吧,根本沒有)。打個比方,我在標準版中發現了一個bug,需要去其他的20+版本裡面都修改一遍,刪庫跑路瞭解一下。。。。
為了提升工資(偷懶),進公司沒多久就在想辦法,如何去提高不同項目的代碼復用率,然後想起來了wtm、abp、simplcommerce這三種項目,似乎有不同項目中代碼服用的地方。
wtm、abp類似,是將底層的部分controller、view封裝在底層類庫,然後項目最外層去使用;
simplcommerce是將所有的模塊放在各個類庫中,然後在主項目中集成;
(或許是我看的不夠深入,歡迎指正)
這三種項目,對於我的不同項目提交代碼復用率來說,不能直接起到作用,但是卻提供了一種思路,我們可以將原始的標準版作為一個類庫,然後在不同的項目中引用這個類庫,做到絕大部分的代碼復用,少部分修改。
那我們開始新建一個簡化版的項目,大概的分組可以做這樣
native/default作為標準版的web類庫,entity是實體、service是服務,實體和服務我們暫且不說,先說明下default這個類庫,這個類庫就是上面所說的標準類庫,讓其他的Tailor.Custom1、Tailor.Custom1.Https、Tailor.Custom2.Https、Tailor.Custom3.Https(以下稱定製項目)去引用,然後再各自的項目中可以個性化修改
default類庫的csproj文件做適當的修改
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup Label="Globals"> <SccProjectName>SAK</SccProjectName> <SccProvider>SAK</SccProvider> <SccAuxPath>SAK</SccAuxPath> <SccLocalPath>SAK</SccLocalPath> </PropertyGroup> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <OutputType>Library</OutputType> </PropertyGroup> ... </Project>
借鑒wtm中使用項目對web類庫的引用,定製項目主要引用是通過Startup=>ConfigureServices=>AddFrameworkService和Startup=>ConfigureServices=>UseFrameworkService將標準版default中的controller和view添加到我們的定製項目中,我們就可以進行使用了。
想到這個,我們大概可以在定製項目中調用所有的標準版功能了。
但是我們如果想在定製項目中對標準版某個controller的某個action進行修改該怎麼辦?
1.我首先想到的是在個性化項目中寫一個同名的controller,然後這個controller繼承自預設版本的對應controller,來達到重寫的目的,但是這個慣性思維陷入誤區了,mvc對於controller的控制不和普通的type繼承一樣,如果同名controller存在,則會報錯。。。在運行時我們可以判斷出是哪個action不同,但是無法通過emit來進行修改,所以這種辦法不可以。
2.第一種辦法不行,那麼我們是否可以對於同名controller進行名稱上的修改,比如homecontroller在Tailor.Custom1中修改未TailorCustom1homecontroller,然後利用路由進行重定向?結果發現路由重定向,要麼自定義一個路由中間件(求大佬給解決辦法,我不會。。),要麼在請求進入的時候對請求進行重定向(這種重定向就是對HttpContext.Request.Path進行特殊判斷和處理,符合條件的進行重定向,但是可能會有很大的問題)
3.使用版本控制的思路,這個似乎可以,我們將標準版default中所有的都作為版本1.0,然後定製化作為2.0,在請求進入的時候,將請求頭添加一個version,如果mvc找不到這個version的controller或者action,會自動轉到預設的1.0版本中
具體實現代碼地址:https://github.com/wangpengzong/Tailor
Native/Default是標準版網站類庫
Tailor.Custom* 是定製化網站,可以在此路徑下繼承Native/Default的對應Controller,利用overvide對需要重寫的action進行重寫,不需要重寫的不進行overvide即可,或者對cshtml進行重寫,不需要重寫的不在對應路徑下增加cshtml文件即可