• 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的不同。

    光是这个话题,零散就看了不少文章,中间也隔了不少时间。

    经过半桶水的了解后,发现世界有多大,差异就有这么大, 难道只能重写了?

    一直关注我博客的好人都知道,我维护的精品框架太多了,见: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连创业系列的文章,不知道大伙还有人知道我在创业不?

  • 相关阅读:
    CMD命令
    存储过程-使用(二)
    存储过程-基本(一)
    事务学习-概念(一)
    组装简历必备的9大要件
    Java 正则表达式详解_正则表达式
    各类程序员学习路线图
    mrql初级教程-使用(er)
    PHP获取当期前运行文件的路径,名字,服务器路径
    mysqldump导入导出mysql数据库
  • 原文地址:https://www.cnblogs.com/cyq1162/p/9019412.html
Copyright © 2020-2023  润新知