Orchard Module,Theme,Core扩展加载概述
Orchard 源码探索(Module,Theme,Core扩展加载概述)
参考: http://www.orchardch.com/Blog/20120830071458
1. host.Initialize();
|
1
2
3
4
5
6
7
8
|
private static IOrchardHost HostInitialization(HttpApplication application) { var host = OrchardStarter.CreateHost(MvcSingletons); host.Initialize(); // initialize shells to speed up the first dynamic query host.BeginRequest(); host.EndRequest(); return host;} |
Orchard作为一个可扩展的CMS系统,需要在初始化或运行时加载一些模块(Modules)或主题(Themes),这些模块或主题统称扩展(Extensions)。
|
1
2
3
4
5
|
host.Initialize();//Called once on startup to configure app domain, and load/apply existing shell configurationSetupExtensions();//在初始化过程中会对扩展进行设置MonitorExtensions();//当添加新的扩展、删除扩展、修改扩展源码后,需要通知扩展加载器(Extension Loader)重新加载或完成一些清理工作,所以需要进行监视:CreateAndActivateShells();//Orchard是一个多租户(Tenant)系统,也就是我们通常所是说的子站点,它允许一个Orchard应用程序中包含多个不同域名的子站点。每个子站点对应一个Shell,需要创建并激活. |
1.SetupExtensions
加载所有扩展,并判断应用程序域是否需要重新启动。 涉及到了CacheManager类:Todo
IParallelCacheContext类:并行缓存类
Orchard包括三种扩展:Core,Theme,Module.
123456folder.AvailableExtensions()HarvestExtensions(...)//looking for extensionsprivateList<ExtensionDescriptor> AvailableExtensionsInFolder(stringpath,stringextensionType,stringmanifestName,boolmanifestIsOptional)vardescriptor = GetExtensionDescriptor(path, extensionId, extensionType, manifestPath, manifestIsOptional);_webSiteFolder.ReadFile(manifestPath);
追根溯源到了file.open。 在此过程中有很多类和功能被忽略掉了,只注意到了主要的脉络,那就是加载扩展的流程。如果被半路的过多细节所羁绊的话,会发现时间是个无底洞。稍后会对在此过程中的一些典型的问题进行梳理,争取做到法网烣烣。
2.MonitorExtensions
当扩展变更或新增时,通过把_current值设为null来促使扩展加载协调类通知orchard,需要重新加载新的或已经变更的扩展。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public void MonitorExtensionsWork(Action<IVolatileToken> monitor) { Logger.Information("Start monitoring extension files..."); // Monitor add/remove of any module/theme Logger.Debug("Monitoring virtual path \"{0}\"", "~/Modules"); monitor(_virtualPathMonitor.WhenPathChanges("~/Modules")); Logger.Debug("Monitoring virtual path \"{0}\"", "~/Themes"); monitor(_virtualPathMonitor.WhenPathChanges("~/Themes")); // Give loaders a chance to monitor any additional changes var extensions = _extensionManager.AvailableExtensions().Where(d => DefaultExtensionTypes.IsModule(d.ExtensionType) || DefaultExtensionTypes.IsTheme(d.ExtensionType)).ToList(); foreach (var extension in extensions) { foreach (var loader in _loaders) { loader.Monitor(extension, monitor); } } Logger.Information("Done monitoring extension files..."); } |
3.CreateAndActivateShells
加载所有的子站点,并激活它们的shell.
|
1
2
3
4
5
6
7
8
9
10
11
|
IEnumerable<ShellSettings> IShellSettingsManager.LoadSettings(); private const string _settingsFileName = "Settings.txt"; private IEnumerable<ShellSettings> LoadSettingsInternal() { var filePaths = _appDataFolder .ListDirectories("Sites") .SelectMany(path => _appDataFolder.ListFiles(path)) .Where(path => String.Equals(Path.GetFileName(path), _settingsFileName, StringComparison.OrdinalIgnoreCase)); foreach (var filePath in filePaths) { yield return ShellSettingsSerializer.ParseSettings(_appDataFolder.ReadFile(filePath)); } } |
显然分为两步,一步是通过app_data文件夹下的Setting.txt加载所有子站点的配置也就是反序列化;第二步ActivateShell(context);
==========================
Orchard.Environment.DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler
Orchard.Environment.IOrchardHost(DefaultOrchardHost)对象用来初始化程序域及Shell(每个子站点对应一个shell)的配置,加载或重加载已存在的模块或扩展。
Orchard Module,Theme,Core扩展加载概述的更多相关文章
- Orchard 源码探索(Module,Theme,Core扩展加载概述)
参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initialize(); private static IOrchardHost H ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- asp.net core重新加载应用配置
asp.net core重新加载应用配置 Intro 我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配 ...
- .Net Core·热加载的实现及测试
阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...
- [转]PHP的执行流程,PHP扩展加载过程
原文:http://www.imsiren.com/archives/535 为了以后能开发PHP扩展..就一定要了解PHP的执行顺序..这篇文章就是为C开发PHP扩展做铺垫. web环境 我们假设为 ...
- Entity Framework Core 懒加载
众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载.不过现在EF Core的开发团队打算 ...
- .NET Core配置文件加载与DI注入配置数据
.NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config等XML格式的配置文件,而.NET Core中建议使用以JSON为格式的配置文件,因为使用起来更 ...
- .net core中加载lua脚本的类库: MoonSharp
前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...
随机推荐
- (大数据工程师学习路径)第四步 SQL基础课程----select详解
准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. 具 ...
- ISA TEST Writeup
刚出来的hack游戏,非常easy,现在只有7关.考虑入门级.没有什么可以玩. http://helloisa.com/ LEVEL 1 细致观察页面,入侵的第一步是收集一切可能产生价值的信息 ps: ...
- .net在arraylist用法
1.什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本号,它提供了例如以下一些优点: 动态的添加和降低元素 实现了ICollection和IL ...
- jQuery的三种bind/One/Live/On事件绑定使用方法
本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要的朋友参考下 今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQ ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
- Matlab图像处理系列4———傅立叶变换和反变换的图像
注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...
- XCL-Charts绘画面积图(AreaChart) 案件1
样本区域地图,发现区域图的时候把做向上注视位置图更具优势的管理. 在改变. 区域图网格和轴是不一样的处理与其它图, 它是用来表示其影响范围的覆盖范围,车桥无段伸出.在这里下处理. 代码: /** * ...
- java_log4j 经典配置
程序加载制定日志文件 public static final String log4j = "log4j.xml"; /** * @declare 加载log4j * @throw ...
- Hash散列算法 Time33算法
hash在开发由频繁使用.今天time33也许最流行的哈希算法. 算法: 对字符串的每一个字符,迭代的乘以33 原型: hash(i) = hash(i-1)*33 + str[i] ; 在使用时.存 ...
- C++中的class
C++中的class是C++不同于C的关键所在: 是面向对象中声明的类: 公有成员public member 在程序的不论什么地方都能够被訪问实行信息隐藏的类将 其publ ...