想深入了解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代替,这也是项目里有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都要好久)

(一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore的更多相关文章

  1. 基于ASP.NET core的MVC站点开发笔记 0x01

    基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...

  2. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

    最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...

  3. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  4. 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用

    前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...

  5. 基于ASP.NET Core 6.0的整洁架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ...

  6. 如何基于asp.net core的Identity框架在mysql上作身份验证处理

    首先了解这个概念,我一开始也是理解和掌握基本的概念,再去做程序的开发.Identity框架是微软自己提供,基于.net core平台,可拓展.轻量 级.面向多个数据库的身份验证框架.IdentityS ...

  7. 基于Asp.Net Core的简单社区项目源代码开源

    2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...

  8. AServer - 基于Asp.net core Kestrel的超迷你http服务器

    AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...

  9. 基于ASP.NET Core 创建 Web API

    使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...

随机推荐

  1. Java虚拟机性能调优(一)

    Java虚拟机监控与调优,借助Java自带分析工具. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat:JVM Statistics M ...

  2. Rust异步之Future

    对异步的学习,我们先从Future开始,学习异步的实现原理.等理解了异步是怎么实现的后,再学习Rust异步编程涉及的2个库(futures.tokio)的时候就容易理解多了. Future rust中 ...

  3. 00-01.Kali Linux 2020.1修改root用户密码

    安装Kali Linux 2020.1系统后,需要使用root用户权限安装软件. 由于VMWare版本的root用户默认密码未知,所以需要在单用户模式下重新设置root用户密码.操作步骤如下: 启动K ...

  4. ubuntu12.04 empathy添加qq登陆

    1,

  5. 用字典优化过长的if 语句

    如果代码中,if 语句,后面elif 过多,完全可以用字典来优化代码. def response(method): if method == "POST": return &quo ...

  6. ESP8266局域网 路由器下作服务器模式串口透传 arduino uno示例 模板参考2

    ESP8266服务器模式串口透传编译需要下载8266的库文件后才可以正常 准备工作 下载一个Arduino IDE,下载8266的库文件ESP8266服务器模式串口透传编译 功能说明 1.直接使用路由 ...

  7. Flink Table Api & SQL 初体验,Blink的使用

    概述 Flink具有Table API和SQL-用于统一流和批处理. Table API是用于Scala和Java的语言集成查询API,它允许以非常直观的方式组合来自关系运算符(例如选择,过滤和联接) ...

  8. Kubernetes学习笔记(九):StatefulSet--部署有状态的多副本应用

    StatefulSet如何提供稳定的网络标识和状态 ReplicaSet中的Pod都是无状态,可随意替代的.又因为ReplicaSet中的Pod是根据模板生成的多副本,无法对每个副本都指定单独的PVC ...

  9. SpringBoot读取application.properties中文乱码

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 解决方案 在ID ...

  10. Day12-微信小程序实战-交友小程序-优化“附近的人”页面与serach组件的布局和样式以及搜索历史记录和本地缓存*内附代码)

    回顾/:我们已经实现了显示附近的人的功能了,可以多个人看到附近的人页面了 但是还是要进行优化有几个问题:1.我们用户选择了其他的自定义头像之后,在首页可以看到头像的变化,但是在附近的人中头像会变成报错 ...