OSS.Common扩展.Net Standard支持实例分享
上篇(.Net基礎(chǔ)體系和跨框架開發(fā)普及)介紹了.Net當(dāng)前生態(tài)下的大概情況,也分享了簡單實(shí)現(xiàn)的過程,這篇文章就是講解我的OSS.Common項(xiàng)目擴(kuò)展.Net Standard 支持的過程,主要集中在:方案的選擇,移植檢測(cè),移植過程,常見問題的解決思路,以及nuget的打包部署這幾個(gè)方面。
在開始之前簡單介紹下OSS.Common項(xiàng)目的涉及的內(nèi)容,方便了解后邊所遇到的問題。這個(gè)類庫是相對(duì)簡單的一個(gè)基礎(chǔ)類庫,提供主要有以下的內(nèi)容:1. 基礎(chǔ)用戶系統(tǒng)設(shè)備信息實(shí)體定義,2. 主流加解密方案實(shí)現(xiàn)(md5,aes,sha1,hmacsha1), 3. ?常規(guī)實(shí)體DTO轉(zhuǎn)化,靜態(tài)擴(kuò)展方法(時(shí)間,字符串等等處理), 4. 基礎(chǔ)日志,緩存,異步輔助靜態(tài)類及默認(rèn)方案實(shí)現(xiàn)(采用了簡單Provider模式,使用者可以注冊(cè)自己的實(shí)現(xiàn)方案), 5. 全局結(jié)果,分頁實(shí)體定義。 其主要作用就是完成對(duì)常見碎化方法的收集規(guī)整,方便在業(yè)務(wù)邏輯中減少不必要的消耗,了解之后我們進(jìn)入具體的擴(kuò)展過程。
一. 方案的選擇
這個(gè)其實(shí)在上篇文章中已經(jīng)做了介紹,當(dāng)前.net core ,.net Framework,mono for Xarmain等都有自己的運(yùn)行時(shí),雖然使用的都是C#語法,但是類庫在不使用可移植或者標(biāo)準(zhǔn)庫的前提下不能直接互相調(diào)用。隨著.net standard 2.0的即將推出,.net core(asp.net core) 的應(yīng)用場(chǎng)景會(huì)越來越普遍,對(duì)舊有項(xiàng)目的兼容需求會(huì)越來越強(qiáng)烈,oss.common也是遇到這個(gè)問題,所以我將對(duì)它進(jìn)行.net standard支持的擴(kuò)展。
由于當(dāng)前項(xiàng)目現(xiàn)在在好幾個(gè).net framework的項(xiàng)目中還在使用,為了舊項(xiàng)目中對(duì)net45的版本的支持不能丟失,所以我會(huì)保留兩套解決方案,一個(gè)為.net Standard 提供支持,一個(gè)為.net framework使用,兩個(gè)類庫項(xiàng)目,共享同一套代碼文件,針對(duì)Framework特有功能通過條件編譯來控制。github上目錄結(jié)構(gòu)已更新,歡迎查看。
二. 移植檢測(cè)
在移植之前我們需要對(duì)移植有個(gè)大概評(píng)估,了解需要代碼改動(dòng)的覆蓋面積,確定代碼的可移植性,這里推薦使用微軟官方提供的移植檢測(cè)工具(ApiPort),或者使用它的VS擴(kuò)展。這里我使用的是vs插件,安裝完插件之后,打開解決方案,查看右鍵菜單會(huì)有如下兩個(gè)選項(xiàng):
首先,點(diǎn)擊第二個(gè)選項(xiàng),配置要檢測(cè)的移植對(duì)比版本,如下圖:
完成對(duì)應(yīng)的檢測(cè)版本之后點(diǎn)擊確定,點(diǎn)擊第一個(gè)選項(xiàng),執(zhí)行分析過程,會(huì)生成html和xsl兩種報(bào)表,html報(bào)表界面如下所示:
?報(bào)表中會(huì)給出對(duì)應(yīng)版本的接口覆蓋情況,以及相關(guān)的建議,可以說是比較詳細(xì)了。
三.移植過程
經(jīng)過上邊的檢測(cè),可以看出oss.common項(xiàng)目 在.net standard1.4下,大概超過20%的代碼不能直接提供支持,我看了一下,主要集中在涉及配置,緩存,反射等特有屬性相關(guān)代碼中,這個(gè)還算在預(yù)期之中,不過看到一堆的紅叉叉還是一陣頭疼,沒辦法,自己的類庫,哭著也要碼完,下邊介紹下移植的步驟。
1. 添加項(xiàng)目文件
為了項(xiàng)目直觀和方便管理,我將原來的OSS.Common類庫修改名稱為OSS.Common.NET45,新建一個(gè)OSS.Common的標(biāo)準(zhǔn)庫項(xiàng)目,兩個(gè)項(xiàng)目文件放在同一目錄下,說明一下,vs2015如果要建標(biāo)準(zhǔn)庫項(xiàng)目需要先建可移植類庫,在類庫屬性頁修改,如果不清楚請(qǐng)看上一篇文章介紹。
這個(gè)時(shí)候如果你直接生成OSS.Common.NET45的項(xiàng)目,是會(huì)出現(xiàn)報(bào)錯(cuò)的,哪怕你沒有做任何實(shí)際的代碼的操作,主要是因?yàn)樘砑涌梢浦差悗煨枰猵roject.json的文件進(jìn)行依賴管理,當(dāng)他們?cè)谕荒夸浵聲r(shí),nuget會(huì)把project.json中的依賴默認(rèn)執(zhí)行還原操作,雖然你當(dāng)前是在生成OSS.Common.NET45項(xiàng)目,沒辦法,就是這么傻,如果你遇到了這個(gè)錯(cuò)誤,在當(dāng)前目錄中再建一個(gè)對(duì)應(yīng)當(dāng)前項(xiàng)目文件的project.json文件就好了,這里我添加了OSS.Common.Net45.project.json文件,文件中添加如下代碼:
{
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
}
}
?
2. 代碼集成
新建好對(duì)應(yīng)的解決方案之后,把代碼文件附件到新建的標(biāo)準(zhǔn)庫下,這個(gè)時(shí)候直接生成會(huì)有很多錯(cuò)誤,這個(gè)時(shí)候我們就需要祭出條件編譯這個(gè)大招了,因?yàn)橐院笾饕蔷S護(hù)標(biāo)準(zhǔn)庫,所以我在舊NET45的舊項(xiàng)目上新建了NETFW的條件編譯符號(hào)?,剩下的就是一個(gè)個(gè)錯(cuò)誤完善了。
在處理兼容的過程中,主要會(huì)面臨這幾個(gè)問題,1. 標(biāo)準(zhǔn)庫完全不支持 ? 2. ?標(biāo)準(zhǔn)庫和Framework的調(diào)用方法不一樣, 3. 可以間接完成標(biāo)準(zhǔn)庫的實(shí)現(xiàn)
這里我把我遇到的情況各舉一個(gè)例子供大家參考:
1. ?標(biāo)準(zhǔn)庫完全不支持,這個(gè)最典型的就是緩存模塊,在.net standard下,System.Runtime.Caching類庫完全被移除了,沒辦法,只能使用#if NETFW 完全把Module模塊下的默認(rèn)Cache實(shí)現(xiàn)給屏蔽了,只能在Framework下才能使用默認(rèn)實(shí)現(xiàn)(本來打算自己實(shí)現(xiàn)一個(gè)緩存類的,不過發(fā)現(xiàn)可能會(huì)帶來不可預(yù)知bug,作廢)。
2.?標(biāo)準(zhǔn)庫和Framework的調(diào)用方法不一樣,舉個(gè)例子就是Type類型下的IsEnum屬性,在net standard下需要.gettypeinfo().IsEnum才可以,舉例代碼:
#if NETFW
if (!enType.IsEnum)
#else
if (!enType.GetTypeInfo().IsEnum)
#endif
3.?可以間接完成標(biāo)準(zhǔn)庫的實(shí)現(xiàn),這常見的如 list的ConvertAll方法,在Framework下有默認(rèn)實(shí)現(xiàn)的,標(biāo)準(zhǔn)庫下是沒有的,這里我在ConvertExtention類自己定義了個(gè)一個(gè):
#if !NET40
public static List<TResult> ConvertAll<TPara, TResult>(this List<TPara> list, Func<TPara, TResult> func)
{
if (list == null)
return null;
var resultList = new List<TResult>(list.Count);
list.ForEach(e => resultList.Add(func(e)));
return resultList;
}
#endif
?當(dāng)然還會(huì)有其他的一些問題,不過還好,基本都已經(jīng)解決,如果有不清楚的可以去下載oss.common代碼自行查看
?
四. nuget打包部署
這個(gè)相對(duì)簡單,在兩個(gè)解決方案中分別生成對(duì)應(yīng)的dll,在lib文件夾中分別添加net45 和 netstandard1.4 文件夾添加對(duì)應(yīng)的dll就行。
??????需要注意的一點(diǎn)就是,最好添加個(gè)各自的依賴,舉個(gè)例子,標(biāo)準(zhǔn)庫的Hmacsha1加密算法在“System.Security.Cryptography.Algorithms” dll程序集下,如果在調(diào)用項(xiàng)目中沒有引用這個(gè)dll,生成是不會(huì)報(bào)錯(cuò)的,但是當(dāng)代碼執(zhí)行調(diào)用的時(shí)候就會(huì)彈出程序集未找到的錯(cuò)誤,當(dāng)然如果發(fā)現(xiàn)這個(gè)問題也可以通過nuget線上安裝命令(install-package)安裝。
給大家看下我的nuget文件配置:
?
如有其它疑問,歡迎關(guān)注公眾號(hào)(osscoder):
原文地址:http://www.cnblogs.com/sunhoy/p/6380478.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的OSS.Common扩展.Net Standard支持实例分享的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft规划了.NET的未来发
- 下一篇: 使用VS Code从零开始开发调试.NE