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 configuration
SetupExtensions();//在初始化过程中会对扩展进行设置
MonitorExtensions();//当添加新的扩展、删除扩展、修改扩展源码后,需要通知扩展加载器(Extension Loader)重新加载或完成一些清理工作,所以需要进行监视:
CreateAndActivateShells();//Orchard是一个多租户(Tenant)系统,也就是我们通常所是说的子站点,它允许一个Orchard应用程序中包含多个不同域名的子站点。每个子站点对应一个Shell,需要创建并激活.

1.SetupExtensions

加载所有扩展,并判断应用程序域是否需要重新启动。 涉及到了CacheManager类:Todo

IParallelCacheContext类:并行缓存类

Orchard包括三种扩展:Core,Theme,Module.

1
2
3
4
5
6
folder.AvailableExtensions()
HarvestExtensions(...)
//looking for extensions
private List<ExtensionDescriptor> AvailableExtensionsInFolder(string path, string extensionType, string manifestName, bool manifestIsOptional)
var descriptor = 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
标签: MVCOrchard

Orchard Module,Theme,Core扩展加载概述的更多相关文章

  1. Orchard 源码探索(Module,Theme,Core扩展加载概述)

    参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initialize(); private static IOrchardHost H ...

  2. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  3. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

  4. asp.net core重新加载应用配置

    asp.net core重新加载应用配置 Intro 我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配 ...

  5. .Net Core·热加载的实现及测试

    阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...

  6. [转]PHP的执行流程,PHP扩展加载过程

    原文:http://www.imsiren.com/archives/535 为了以后能开发PHP扩展..就一定要了解PHP的执行顺序..这篇文章就是为C开发PHP扩展做铺垫. web环境 我们假设为 ...

  7. Entity Framework Core 懒加载

    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载.不过现在EF Core的开发团队打算 ...

  8. .NET Core配置文件加载与DI注入配置数据

    .NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config等XML格式的配置文件,而.NET Core中建议使用以JSON为格式的配置文件,因为使用起来更 ...

  9. .net core中加载lua脚本的类库: MoonSharp

    前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...

随机推荐

  1. tomcat-jQ-springMVC-bootstrap

    基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...

  2. 【DataStructure】Some useful methods for arrays

    Last night it took me about two hours to learn arrays. For the sake of less time, I did not put emph ...

  3. Hibernate各保存方法之间的差 (save,persist,update,saveOrUpdte,merge,flush,lock)等一下

    hibernate保存  hibernate要保存的目的是提供一个方法,多.它们之间有许多不同之处,点击此处详细说明.使得差: 一.预赛: 在所有.阐释.供hibernate,,transient.p ...

  4. request的setAttribute()怎么用的?

    request.setAttribute()怎么用的?JSP1代码String [] test=new String[2];test[0]="1";test[1]="2& ...

  5. java中IO写文件工具类

    以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...

  6. CSS3+HTML5特效4 - 横向无缝滚动

    先看例子 This is a test 1. This is a test 2. This is a test 3. This is a test 4. This is a test 5. This ...

  7. js模块开发

    js模块开发(一) 现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经 ...

  8. C#抓取AJAX页面的内容

    原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...

  9. Java之final、finalize、finally的区别

    一.性质不同(1)final为关键字:(2)finalize()为方法:(3)finally为为区块标志,用于try语句中:二.作用(1)final为用于标识常量的关键字,final标识的关键字存储在 ...

  10. Oracle查字符集查版本号

    原文:Oracle查字符集查版本号 ---查字符集 select * from nls_database_parameters ---查版本 查看oracle的版本信息 (1)用客户端连接到数据库,执 ...