继前篇,在Orchard Application_Start() -> HostInitialization() 里,调用 OrchardStarter.CreateHost创建IOrchardHost实例。

1: /// <summary>

2: /// OrchardHost Initialization. OrchardHost 初始化。

3: /// </summary>

4: private static IOrchardHost HostInitialization(HttpApplication application)

5: {

6: // 注册三个 MVC原生类型为单例模式:RouteTable.Routes、ModelBinders.Binders、ViewEngines.Engines。

7: var host = OrchardStarter.CreateHost(MvcSingletons);

8:

9: host.Initialize();

10:

11: // initialize shells to speed up the first dynamic query

12: // 初始化一个 shell。

13: host.BeginRequest();

14: host.EndRequest();

15:

16: return host;

17: }

1: /// <summary>

2: /// 创建 OrchardHost。 CreateHostContainer -> HostContainer.Resolve(IOrchardHost)。

3: /// </summary>

4: /// <param name="registrations">在Global中定义,注册三个 MVC原生类型为单例模式:RouteTable.Routes、ModelBinders.Binders、ViewEngines.Engines。</param>

5: /// <returns></returns>

6: public static IOrchardHost CreateHost(Action<ContainerBuilder> registrations)

7: {

8: var container = CreateHostContainer(registrations);

9: return container.Resolve<IOrchardHost>();

10: }

在创建HOST之初,就构建了HostContainer,这是一个静态方法,用于构造Host解析容器,并使用Autofac为系统进行IOC注册。

CreateHostContainer代码省略。

通过总结我们知道Autofac几种常用的类型注册方式如下:

一、类型注册

直接按照类型及其接口定义进行注册

二、实例注册

使用类型实例进行注册

三、命名注册

使用类型及其接口定义进行注册,使用 .Named扩展进行约束

四、键值注册

使用类型及其接口定义进行注册,使用 . Keyed扩展进行约束

在CreateHostContainer方法里,除了上述形式外,还使用了:

五、模块注册

模块注册,是为抽象类 Autofac.Module定义的一个实现。其主要的方法有

u Load 在IOC注册调用RegisterModule时发生,可以在Load中进行类型注册,就像前四种注册方式一样进行。

u Configure 在RegisterModule调用后,将Load方法里的内容加载到Autofac注册表里时发生。

通过测试发现,在IOC注册时,前四种注册方式,所注册的类型默认按类型(Type)、命名(Named)、键值(Keyed)进行了分组,在被解析的类型构造参数中,可以使用参数构造定义的约束来使用不同的注册类型。并且Autofac 对同一个接口类型注册进来的不同实现类型,会自动形成一个 IEnumerable-List(即 可枚举的集合)。

DEMO代码

相关参考

http://www.cnblogs.com/hkncd/archive/2012/11/28/2792474.html

213. Orchard学习 二 3、001.IOrchardHost 与Autofac的更多相关文章

  1. 211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

    一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:B ...

  2. 200. Orchard学习 目录

    201. Orchard学习 一.基础 210. Orchard学习 二.启动 211. Orchard学习 二 1.Application_Start 212. Orchard学习 二 2.Manu ...

  3. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  4. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  5. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  6. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  7. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  8. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  9. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

随机推荐

  1. springcloud ConfigServer的工作原理

    前话 根据前文得知,bootstrapContext引入了PropertySourceLocator接口供外部源加载配置,但作用是应用于子级ApplicationContext的环境变量Environ ...

  2. [leetcode]380. Insert Delete GetRandom O(1)常数时间插入删除取随机值

    Design a data structure that supports all following operations in average O(1) time. insert(val): In ...

  3. ORACLE多表关联UPDATE 语句[z]

    [z]https://www.cnblogs.com/franson-2016/p/5988303.html 1) 最简单的形式 SQL 代码 --经确认customers表中所有customer_i ...

  4. nginx配置备忘

    一.本地测试环境配置 upstream gongsibao{ server ; server ; #fair; } server { listen ; server_name ubuntu00.xus ...

  5. ----关于posotion的sticky与fixed的区别----

    sticky 出现在正常流当中,不能设置定位,随页面滚动 (sticky = relative + fixed) fixed 不出现在正常流当中,能设置定位,随页面滚动 eg: html: <p ...

  6. 词向量之word2vec实践

    首先感谢无私分享的各位大神,文中很多内容多有借鉴之处.本次将自己的实验过程记录,希望能帮助有需要的同学. 一.从下载数据开始 现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看. ...

  7. Chapter3_操作符_其他操作符

    对java中其他操作符及一些注意事项的总结 (1)按位操作符 按位操作符操作基本整数类型中的单个二进制位,有与(&),或(|),非(~).按位操作符还可以和等号(=)联合使用,如~=,& ...

  8. 2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)

    传送门 题意:动态插入点,维护凸包面积. 思路:用setsetset维护极角序来支持面积查询即可. 然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差. 代码: #include<bi ...

  9. IText实现对PDF文档属性的基本设置

    一.Itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...

  10. 第38章:MongoDB-集群--Replica Sets(副本集)---多机的搭建

    ①机器环境 182.48.115.236    master-node(主节点) 182.48.115.237    slave-node1(从节点) 182.48.115.238    slave- ...