1. 程式人生 > >Taurus.MVC 支援Asp.Net Core 的過程

Taurus.MVC 支援Asp.Net Core 的過程

前言:

這些天,似乎.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的不同。

光是這個話題,零散就看了不少文章,中間也隔了不少時間。

經過半桶水的瞭解後,發現世界有多大,差異就有這麼大, 難道只能重寫了?

所以,如果同一個框架,要同時維護兩份不同版本的原始碼(.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,編解碼等處理。

答:基本是轉移了使用的方法位置。

經過很用力的擼,終於解決了上述遇到的問題。

這些重寫的原始碼,已經提交提交了。

不過以上的重寫,都是打包在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連創業系列的文章,不知道大夥還有人知道我在創業不?