對於ASP.NET Core開發,不管是MVC,還是Web API,Taurus.MVC 為你提供另一種開發選擇,正式發佈,應該在下周。 ...
前言:
這些天,似乎.NET Core相關的新聞和文章經常在我眼前晃~~~
昨天,微軟又發佈了.Core 2.1,又愰了一下,差點沒亮瞎我的眼睛。
好吧,大概是上天給我的暗示,畢竟 CYQ.Data 早就支持上.Core了。
而 Taurus.MVC ,估計也鬧委屈了,好吧,大慈大悲的憐見你一回,給你上ASP.NET Core支持吧。
又要一不小心就研究.NET Core了,這東西,只有家裡的電腦有VS2017的環境,因此只能在家研究。
中間停停走走,思考了N天,最後用上三十幾年的手速,敲足一天一夜代碼,終於見到目署光了。
下麵先和大伙分享下經驗~~~。
Taurus.MVC 如何支持.NET Core?
對於Taurus.MVC,其核心就兩個dll項目:
CYQ.Data 已經支持上.NET Core。
就只要處理好 Taurus.Core 項目也支持.NET Core就好了吧。
想想就感覺好簡單的樣子。
裡面的代碼,不多,應該不會像當年CYQ.Data支持 .NET Core 那麼費心思。
這個從哪弄起好呢~~~~
思考的過程,Taurus.Core項目針對.NET Core重寫?
Taurus.Core,和CYQ.Data不同,畢竟Taurus.MVC=CYQ.Data+Taurus.Core:
CYQ.Data 是資料庫操作組像,雖然EF強大太多,但畢竟不涉及到程式啟動流程。
Taurus.Core,則是從IHttpModule,IHttpHandle為入口開啟的自定義MVC世界
建個Demo看看ASP.NET Core的項目:
其啟動則是從Program,這不就是一個Exe程式麽?
再到Startup:
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { }
又包含Service服務和一堆Use方式的中件間配置。
網上的文章服務服務的叫,是什麼鬼,是操作系統的進程服務嗎?
想多了~~~一毛錢關係也沒有,人家就是喜歡叫這個名而已。
所以研究的第一個課題就是:傳統ASP.NET的啟動模式和ASP.NET Core啟動模式的差異。
換句話說就是:IHttpModule、IHttpHandler和Startup的不同。
光是這個話題,零散就看了不少文章,中間也隔了不少時間。
經過半桶水的瞭解後,發現世界有多大,差異就有這麼大, 難道只能重寫了?
一直關註我博客的好人都知道,我維護的精品框架太多了,見:https://github.com/cyq1162
所以,如果同一個框架,要同時維護兩份不同版本的源碼(.NET Core版本和非.NET Core版本),我會蛋傷的。
於是,看.NET Core 寫相容代碼的時候,內心就會吐槽微軟蛋疼,說好的相容性呢?心中蕩漾起那消失已失的草泥馬!
後來,心中一個聲音,鬧騰,太鬧騰,放下吧,放下吧~~~~
CYQ.Data 支持.NET Core 方式的餘光再次神降
還記得當年:
思考CYQ.Data支持.NET Core的時候,
轉展了失眠了無數個白天,
黑夜中左手右手一個慢動作,
經過不斷的思考與試驗,
最後感動蒼天,
神光突降,
最出了最後的解決方案,
非常閃光。
那就是:
把所有不相容的代碼,自己慢慢補全吧,這是一件很費腦的體力活:
所以,當所有的相容性代碼魯完以後,原有的CYQ.Data 代碼一行無變。
只要將這補全的相容性文件夾包含進項目,馬上就神奇般的支持上.NET Core。
同理可證:下麵看看都有這次又要補全多少所需的相容性代碼!
Taurus.MVC 支持.NET Core的相容性代碼
補全完善:System.Web.HttpContext系列相容性代碼
看起來不少,基本核心的都要補,又是一次費腦的體力活,哥的夜生活,就被你們敗光了時間~~~~
在這過程,有過以下不少帶坑的問題:
1:在Taurus.MVC Core中,關於是傳遞Core版本的HttpContext,還是傳遞Web版HttpContext?
答:用Web版本(讓傳統得到延續,節省學習成本)
2:對於HttpContext,HttpResponse,HttpRequest ,是用繼承,還是不用繼承?
答:不用繼承,因為無法繼承,有些屬性名的返回值衝突了。
3:ASP.NET Core目錄結構路徑和傳統的方式的差異性。
答:.NET Core區分執行目錄(dll和exe目錄)和資源目錄(wwwroot),而傳統就是一個根目錄和bin目錄。
4:其它如:文件上傳、路徑重寫、Cookie,編解碼等處理。
答:基本是轉移了使用的方法位置。
經過很用力的擼,終於解決了上述遇到的問題。
這些重寫的源碼,已經提交提交了。
可以見:https://github.com/cyq1162/cyqdata/tree/master/DotNetCore
不過以上的重寫,都是打包在CYQ.Data Core,
畢竟之前就有一些了,順路也補多幾個,
方便後續對 ASP.NET Aries 的.NET Core版本的支持。
Taurus.Core項目,僅追加了一個中間件文件
看圖擼代碼:
原有代碼一行未動,新增了一個中間件:TaurusMiddleware.cs
中間件的源碼,由於未提交,這裡先放出來:
using CYQ.Data; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Taurus.Core; namespace Microsoft.AspNetCore.Http { /// <summary> /// 為支持Asp.net core 存在的文件 /// </summary> public class TaurusMiddleware { private readonly RequestDelegate next; public TaurusMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { try { System.Web.HttpApplication.Instance.ExecuteEventHandler(); //處理信息 await next(context); } catch (Exception ex) { Log.WriteLogToTxt(ex); } } } public static class TaurusExtensions { public static IApplicationBuilder UseTaurusMvc(this IApplicationBuilder builder, IHostingEnvironment env) { //執行一次,用於註冊事件 UrlRewrite url = new UrlRewrite(); url.Init(System.Web.HttpApplication.Instance); AppConfig.WebRootPath = env.WebRootPath;//設置根目錄地址,ASPNETCore的根目錄和其它應用不一樣。 return builder.UseMiddleware<TaurusMiddleware>(); } } }
具體代碼是神碼意思,就不解釋了,瞭解.NET Core入門的都會懂的。
Taurus.MVC的中間件的使用(提前預告):
在引入CYQ.Data和Taurus.Core(dll或源碼項目)後,中間件的引入代碼:
添加這三行代碼,引入上下文和TaurusMVC後,運行看看效果(截圖太美,兩張就好):
1:
2:
一切都運行的很完美,當然,這些都是體內精蟲的功勞。
總結:
在ASP.NET Core的開發,這條道上:不管是MVC,還是Web API,
微軟都是:ASP.NET Core+EF
今天,大伙多了一種選擇:Taurus.MVC+CYQ.Data。
後者,在繼承跨平臺的前提下,保留了傳統高性能的模式,節省了學習成本。
正式發佈,待整理整理,應該在下周。
PS:好久沒寫IT連創業系列的文章,不知道大伙還有人知道我在創業不?