• (一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore


      想深入了解OrchadCore源码许久了,但是读源码的时候遇到很多问题而网上的参考资料太少了(几乎都是OrchadCms不带OrchardCore的),现在解决得差不多了,做下笔记方便自己查看,有错误之处也请大家帮忙指出,谢谢。

      OrchardCore是一个基于asp.net core的cms(废话),其结构类似于asp.net core(为啥说类似我也不知道,asp.net core的源码我只看了一部分,似是而非吧)。因此,我将直接从asp.net core的角度来解析OrchardCore,从asp.net core的角度就是说关于asp.net core的靠自己理解,可以省略1万字。

      废话结束,开始正题,源码直接github搜索OrchardCore就可以下载了,我直接用visual studio(我不用rider,首先我没钱买,其次我之前是弄.net framework不是java,我用的vs都是社区版)自带的git去clone半天(这小水管受不了后面直接码云找镜像仓库clone了)。

      clone完了,第一个坑出现了,选择记得选择版本和分支,说多都是泪,OrchardCore支持的版本(从.net core 1.0到.net core 3.1都有)和自身的分支太多了,第一次接触没注意跳坑了导致各种出错(原因是我没有装对应的.net core版本,默认好像2.x),后面发现了就直接用.net core 3.1的dev分支。新手常见错误,大家尽管嘲笑,让我涨涨记性,特么有次我自己的代码都改错分支!

      正文开始,vs加载完OrchardCore解决方案出现很多项目,非常清晰,加粗的OrcharCore.Cms.Web项目就是启动项目。

      启动项目的内容非常熟悉非常简洁,就是一个asp.net core的项目。

      当然你会发现多了个Localization文件夹和NLog.config配置文件,除了这两个之外跟我们正常新建asp.net core项目一模一样,所有我们直接从asp.net core解读开始剖析。

      程序入口Program.cs文件的main函数(为啥是这样我也不知道,反正学c、学java还是c#的时候老师和书都是这样教的,应该是定义或者约定俗成吧)打开如下:

    namespace OrchardCore.Cms.Web
    {
        public class Program
        {
            public static Task Main(string[] args)
                => BuildHost(args).RunAsync();
    
            public static IHost BuildHost(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureLogging(logging => logging.ClearProviders())
                    .ConfigureWebHostDefaults(webBuilder => webBuilder
                        .UseStartup<Startup>()
                        .UseNLogWeb())
                    .Build()
                ;
        }
    }

      非常明显的asp.net core代码,创建Host(主机),然后Build(生成),然后Run(运行),跟新建asp.net core项目唯一区别就多了ConfigureLogging和ConfigureWebHostDefaults两个配置了,意思也很清楚(不清楚得去看asp.net core的源码了,此处省略1万个字),就是清除默认日志提供者然后用NLog代替(感觉就是个人爱好,你用log4net又咋样),这也是项目里有NLog.config这个配置文件的原因。要了解logging.ClearProviders()直接看asp.net core的api去。UseNLogWeb()是OrchardCord自定义的扩展方法,代码非常清楚就是加载NLog.config这个配置文件,NLog我也是只会简单用,就不分析了,以后有空再去看源码

            public static IWebHostBuilder UseNLogWeb(this IWebHostBuilder builder)
            {
                LayoutRenderer.Register<TenantLayoutRenderer>(TenantLayoutRenderer.LayoutRendererName);
                builder.UseNLog();
                builder.ConfigureAppConfiguration((context, configuration) =>
                {
                    var environment = context.HostingEnvironment;
                    environment.ConfigureNLog($"{environment.ContentRootPath}{Path.DirectorySeparatorChar}NLog.config");
                    LogManager.Configuration.Variables["configDir"] = environment.ContentRootPath;
                });
    
                return builder;
            }

      我重点关注还是入口文件的UseStartup<Startup>(),总所周知这个是asp.net core的核心中的核心,没错,就是服务和中间件,终于来到重点了,这个会调用项目里Startup.cs的代码通过中间件生成管道,至于原理又是关于asp.net core的运行原理又可以省略1万字。

      接触过asp.net core都知道通过Startup的ConfigureServices方法注册服务,Configure方法配置管道中间件。

        public class Startup
        {
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddOrchardCms();
            }
    
            public void Configure(IApplicationBuilder app, IHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseStaticFiles();
    
                app.UseOrchardCore();
            }
        }

      asp.net core表示服务配置可以没有。服务部分我是直接跳过了,这里是直接调用扩展方法services.AddOrchardCms()配置服务,其实服务按我理解就是依赖注入的注册,依赖注入是asp.net core的基础没啥好说的,反正就是后面可以自动实例化构造函数的类,所以这个地方导致我后面又掉了一个坑(找错实例的类)。

      asp.net core的中间件配置一定要有,所以这部分是重中之重,前面的app.UseDeveloperExceptionPage()和app.UseStaticFiles()就不用说了,一般的asp.net core项目都有,就是异常和静态文件中间件。这个OrchardCore最重要的内容在于app.UseOrchardCore()这个扩展方法,这个扩展方法主要是后面两个中间件,当然前面那个PoweredByMiddleware也很重要(作者说我辛辛苦苦弄一个cms你居然说我的版权不重要那我就惨了),我这里只是说程序的运行很重要并不是不尊重版权(我本身很尊重各个版权的,所以vs我只能用社区版、sqlserver只能用epress版)

        public static class ApplicationBuilderExtensions
        {
            /// <summary>
            /// Enables multi-tenant requests support for the current path.
            /// </summary>
            public static IApplicationBuilder UseOrchardCore(this IApplicationBuilder app, Action<IApplicationBuilder> configure = null)
            {
                var env = app.ApplicationServices.GetRequiredService<IHostEnvironment>();
                var appContext = app.ApplicationServices.GetRequiredService<IApplicationContext>();
    
                env.ContentRootFileProvider = new CompositeFileProvider(
                    new ModuleEmbeddedFileProvider(appContext),
                    env.ContentRootFileProvider);
    
                // Init also the web host 'ContentRootFileProvider'.
                app.ApplicationServices.GetRequiredService<IWebHostEnvironment>()
                    .ContentRootFileProvider = env.ContentRootFileProvider;
    
                app.UseMiddleware<PoweredByMiddleware>();
    
                // Ensure the shell tenants are loaded when a request comes in
                // and replaces the current service provider for the tenant's one.
                app.UseMiddleware<ModularTenantContainerMiddleware>();
    
                configure?.Invoke(app);
    
                app.UseMiddleware<ModularTenantRouterMiddleware>(app.ServerFeatures);
    
                return app;
            }
        }

      ModularTenantContainerMiddleware和ModularTenantRouterMiddleware这两个中间件撑起OrchardCore一片天,下次就从UseOrchardCore继续!从asp.net core角度去看真心简化好多,但是后面估计要恶补下asp.net core了(源码的项目太多,这个感觉要看很久,而且目前github上面的asp.net core源码都是基于.net 5的,build都要好久)

  • 相关阅读:
    Mac pycharm专业版安装以及破解方法
    Django 错误之 No module named ‘MySQLdb’
    archery部署
    MySQL监控内容
    mac安装神器brew
    4. 寻找两个有序数组的中位数
    7.整数反转
    2.两数相加
    1. 两数之和
    141. 环形链表
  • 原文地址:https://www.cnblogs.com/ShuiSen/p/13272443.html
Copyright © 2020-2023  润新知