概述 Host 是应用程序域级的单例,代表了Orchard应用程序.其处理应用程序生命周期中的初始化.BeginRequest事件.EndRequest事件等. 可以简单理解为HttpApplication的功能转移到了Host身上.从源码角度上看,Host对应的是实现了IOrchardHost接口的 DefaultOrchardHost类. 回顾一下之前对Orchard.Web.MvcApplication类的分析.在Orchard启动时,会创建一个DefaultOrchardHost对象:…
  本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译.   源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象.所以先对Orchard架构有个整体的了解,以及对一些基本概念有所认识.   创建一个基于Web的CMS(内容管理系统)不同于创建一个普通的Web应用程序:它更像是建立一个应用程序容器. 这样一个系统,必须拥有优良的开放性.可扩展性.但是作为一个可扩展系统,它可能会面临应用程序"可用性"的挑战:在系统中的核心模块与未知…
今天来分析Spring的资源接口Resource的各个实现类.关于它的接口和抽象类,参见上一篇博文——Spring源码分析——资源访问利器Resource之接口和抽象类分析 一.文件系统资源 FileSystemResource 文件系统资源 FileSystemResource,资源以文件系统路径的方式表示.这个类继承自AbstractResource,并实现了写的接口WritableResource.类全称为public class FileSystemResource extends Ab…
视图类view主要用于页面内容的输出,模板调用等,用在控制器类中,可以使得控制器类把表现和数据结合起来.下面我们来看一下执行流程. 首先,在控制器类中保持着一个view类的对象实例,只要继承自控制器父类的类都可以使用这个实例,所以我们在控制器子类中就可以使用view类实例去很容易的调用模板,输出内容. 看Controller.class.php类的第22行和35行,分别声明了一个实例变量,在构造函数中实例化一个view实例. // +-------------------------------…
概述 关于ASP.NET MVC中路由有两个基本核心作用,一是通过Http请求中的Url参数等信息获取路由数据(RouteData),路由数据包含了area.controller.action的名称等信息.只有获取了匹配的路由数据,才有可能转入ASP.NET MVC管道:二是根据由规则生成Url,比如要根据某些数据生成View上显示的链接.   Orchard对路由进行扩展主要基于如下原因: (1).路由定义在各个模块中.在Orchard应用程序初始化时将分散在各个模块的路由定义收集起来统一注册…
概述在Orchard中,提出子站点(Tenant)的概念,目的是为了增加站点密度,即一个应用程序域可以有多个子站点. Shell是子站点(Tenant)级的单例,换句话说Shell代表了子站点.对比来看,Host是应用程序域级的单例,代表了Orchard应用程序.本文将分析Shell相关的各种类型.   一.获取ShellSettings 在 DefaultOrchardHost类的CreateAndActivateShells方法中,由Shell设置管理器 ShellSettingsManag…
概述 Orchard作为一个可扩展的CMS系统,是由一系列的模块(Modules)或主题(Themes)组成,这些模块或主题统称为扩展(Extensions).在初始化或运行时需要对扩展进行安装:DefaultOrchardHost.SetupExtensions方法. 当添加新的扩展.删除扩展或修改扩展源码后,需要通知扩展加载器(Extension Loader)重新加载或完成一些清理工作,所以需要进行监视:DefaultOrchardHost.MonitorExtensions方法. Orc…
概述 默认情况下,ASP.NET MVC内置的DefaultControllerFactory负责Controller实例的创建.Orchard定义了一个继承自DefaultControllerFactory类的Orchard.Mvc.OrchardControllerFactory类并在OrchardStarter类中进行注册:         // 以下代码来在Orchard.Environment.OrchardStarter类         ControllerBuilder.Curr…
概述 Orchard.WarmupStarter程序集包含三个类:WarmupUtility.WarmupHttpModule和Starter<T>.该程序集主要为Orchard应用启动初始化服务.一.WarmupUtility类 该类是一个静态工具类,包含一个静态只读String型字段WarmupFilesPath,以及三个方法EncodeUrl.ToUrlString和DoBeginRequest. 1.WarmupFilesPath其值为"~/App_Data/Warmup/&…
概述 分析一个的ASP.NET项目源码,首先可以浏览其项目结构,大致一窥项目其全貌,了解项目之间的依赖关系.其次可以浏览Web.config和Global.asax文件,找到应用程序的入口点. 本 文主要分析Orchard项目的Global.asax文件,而真正的分析入口点在Global.asax的CodeBehind文件 Global.asax.cs中,即Orchard.Web.MvcApplication类(以下简称MvcApplication类).   MvcApplication类处理了…
概述 CacheModule也是一个Autofac模块.   一.CacheModule类 CacheModule将DefaultCacheManager注册为ICacheManager:      public class CacheModule : Module {          protected override void Load( ContainerBuilder builder) {             builder.RegisterType<DefaultCacheMa…
概述 采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦. 在.Net 中使用观察者模式,可以使用事件(委托)和接口(类).Orchard Event  Bus使用的是接口的形式,这样方便将“观察者”注册到Autofac容器中.EventsModule模块是构成Orchard Event  Bus的一部分.这里先分开分析Orchard Event Bus涉及的类型和知识点,然后在将他们组合起来分析Orchard Event  Bus的机制. 一.Registra…
CollectionOrderModule类是一个Autofac模块(Module,将一系列组件和相关的功能包装在一起),而非Orchard模块.其作用是保证多个注册到容器的组件能按FIFO(First In First Out)的顺序提取.下面举例说明:1.创建ICustomerService接口:     public interface ICustomerService { }    2.创建两个实现ICustomerService接口的类:     public class Defaul…
概述 OrchardStarter类是个静态类,主要作用是配置Autofac容器以及创建IOrchardHost(DefaultOrchardHost)对象,分别对应CreateHost和CreateHostContainer这两个静态方法. 一.CreateHost方法 CreateHost方法接受一个委托参数,返回一个IOrchardHost(Orchard宿主)型实例:         public static IOrchardHost CreateHost( Action<Contai…
在Orchard,模块和主题都是可以插拔式的,在源码处理时,用类型(参考:DefaultExtensionTypes)区分,都没太大的本质区别,以下都称做模块. 插件的支持,实现分以下几步: 搜集模块的信息 确定模块的加载器 复制DLL到App_Data\Dependencies文件夹(动态编译的项目不复制) 加载启用模块的程序集,如果是动态编译项目,开始编译 得到程序集的里所有公共的类(不包含IsAbstract) 加载类型到autofac容器中,构造网站运行环境 搜集模块信息 Orchard…
BeginRequest事件处理的作用是确保所有Shell已经加载,或者在扩展有变化的时候重新加载.          void IOrchardHost .BeginRequest() {             Logger.Debug( "BeginRequest");             BeginRequest();         }           protected virtual void BeginRequest() {             // Ens…
与CollectionOrderModule一样,LoggingModule也是一个Autofac模块.它以属性注入的方式给需要日志服务的对象设置Logger.    如果一个类有Orchard.Logging.ILogger型的公共可写实例属性(忽略索引),Autofac容器在解析(Resolve)该类的时 候,将"注入"一个ILogging实现类的实例.Orchard默认会注入一个CastleLogger对象.当然Orchard也允许一个类中有多个 ILogger型属性,也支持将C…
忽然,发现,网上的公开资料都是教你怎么继承一个baseadapter,然后重写那几个方法,再调用相关view的 setAdpater()方法, 接着,你的item 就显示在手机屏幕上了.很少有人关注android adpater模式机制的实现原理,比较深入的也不过是说说adapter getview()中的回收情况.今天把相关的源码看了一遍,把自己的理解记录下来. AdpaterView 概览 AdpaterView api手册的说明:An AdapterView is a view whose…
先看LockedQueue.h template <class T, typename StorageType = std::deque<T> >class LockedQueue{......} 一个带锁的多线程可安全访问的类,容器默认使用std::deque 常规代码 push进T类型的元素 pop出T类型的元素 使用锁定 保证线程安全 相比C++11之前的繁琐做法 现在加锁可以使用 std::lock_guard 当使用std::lock_guard<std::mute…
ExtensionLoader类是整个SPI的核心类,每个SPI都会对应一个ExtensionLoader类实例,这个类的构造方法如下: private ExtensionLoader(Class<?> type) { this.type = type; objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAd…
概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展.主要集中在如下几个方面: 1.Routing(路由)相关 2.Controller相关 3.ViewEngines相关 4.Model绑定(Binding)相关 5.Model验证器(Validator)相关   我们将分几个篇幅来分别分析.     参考资料: How ASP.NET MVC Wor…
EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task).           void IOrchardHost .EndRequest() {             Logger.Debug( "EndRequest");             EndRequest();         }             protected virtual void EndRequest() {        …
    ICacheManager  &   ICacheHolder              Orchard缓存管理主要通过 ICacheManager 接口对外提供缓存服务. 其实现类DefaultCacheManager的构造函数如下, DefaultCacheManager(Type component/*此类型是缓存服务消费者的类型名称,在CacheModule中配置注册, 其主要作用是在CacheHolder中创建一个cacheKey,cacheKey使用三元组(Tuple)数组结…
本文主要基于Hadoop1.1.2分析HDFS中的关键数据结构. 1 NameNode 首先从NameNode开始.NameNode的主要数据结构如下: NameNode管理着两张很重要的表: 1)  filename->blocksequence (namespace) 2)  block->machinelist ("inodes") 第一张表保存在磁盘上,第二张表在每次NameNode启动的时候重建.这两张表的信息分别保存在FSDirectory和BlocksMap中…
核心数据结构: core.types.transaction.go type Transaction struct { data txdata // caches hash atomic.Value size atomic.Value from atomic.Value } Transaction.data type txdata struct { AccountNonce uint64 `json:"nonce" gencodec:"required"` Pric…
位于代码event-internal.h中. event_base类似事件的集合,你创建一个事件,必须将该事件指定一个集合. struct event_base { 50     const struct eventop *evsel; /*evsel和evbase就类比与类和对象之间的关系,evbase是evsel的 51     一个具体实现,指在这里使用的复用模型*/ 52     void *evbase; 53     /*这个event_base所关注的事件数目*/ 54     i…
要创建一个KafkaSpout对象,必须要传入一个SpoutConfig对象,KafkaSpout的构造函数定义如下: public KafkaSpout(SpoutConfig spoutConf) { _spoutConfig = spoutConf; } SpoutConfig继承KafkaConfig,并实现Serializable,由于在KafkaConfig中所有的属性字段都是public的因此在SpoutConfig中可以直接引用,SpoutConfig类的定义如下其中核心字段添加…
在mvc模式中,c代表的就是控制器,是是应用程序中处理用户交互的部分.通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据.控制器是沟通视图和模型的桥梁,他接受用户请求,并调用模型层去处理用户请求,处理完成后他再把处理后的数据给视图层.Controller类应该是一个基类,定义了控制器层的基本方法,由开发人员去继承此类,写自己的处理逻辑.tp在其框架中也定义了Controller基类,其中定义了我们常使用的一些方法,最主要是与视图交互的方法.所以我们从代码可以看出其基本就是一个对视图类操…
一:IllegalArgumentException非法参数类,这个类继承父类RuntimeException public class IllegalArgumentException extends RuntimeException 重载的几个构造方法都是直接调用父类的构造方法: //无参数构造器,默认构造器 public IllegalArgumentException() { super(); } //参数为字符串String的构造器 public IllegalArgumentExce…
简单工厂模式.抽象工厂模式和适配器模式 依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程. A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. B.抽象不应该依赖于具体,具体应该依赖于抽象. 面相对象设计将就高内聚.低耦合,高内聚指功能相关性很强的紧密的结合在一起,遵守单一职责原则:耦合是指不同模块或不同层次代码的联系程度,耦合性越低,模块独立性越强,耦合性越高,模块独立性越弱,高耦合的软件,往往修改一处…