简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件。 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册。这种注册共有三种方式,其中最简单的就是用As方法,例如,ArrayList继承了IEnumerable接口,若将其注册到Autofac中,写法如下所示:

ContainerBuilder builder = new ContainerBuilder();  
            builder.RegisterType<ArrayList>().As<IEnumerable>();  
            // then  
            IContainer container = builder.Build();  
            ArrayList result = (ArrayList)container.Resolve<IEnumerable>();

有时难免碰到多个类映射到同一种接口,比如ArrayList和SortedList都继承了IEnumerable接口,为了准确获取想要的类型,就有了第二种方式--Named方法,可根据字符串注册并解析相应的类。代码如下:

builder.RegisterType<ArrayList>().Named<IEnumerable>("array");  
            builder.RegisterType<SortedList>().Named<IEnumerable>("sort");  
            // then  
            IContainer container = builder.Build();  
            ArrayList result = (ArrayList)container.ResolveNamed<IEnumerable>("array");  
            SortedList result1 = (SortedList)container.ResolveNamed<IEnumerable>("sort");

然而相对于字符串,枚举更易读易用,但在Autofac中使用枚举会有些麻烦,因为Named只接受字符串,必须将枚举转换成字符串才能使用。比如,现在用ListType枚举来代替“array”和“sort”字符串。如下所示:

public enum ListType{ Array, Sort }  
builder.RegisterType<ArrayList>().Named<IEnumerable>(ListType.Array.ToString());

这种转换略显笨拙,而且让枚举失去原有价值。于是,为不多此一举,第三种方式就产生了--Keyed方式,该方法可以接受任何类型作为参数。以上文中的ListType枚举为例,代码如下:

builder.RegisterType<ArrayList>().Keyed<IEnumerable>(ListType.Array);  
            builder.RegisterType<SortedList>().Keyed<IEnumerable>(ListType.Sort);  
            // then  
            IContainer container = builder.Build();  
            ArrayList result = (ArrayList)container.ResolveKeyed<IEnumerable>(ListType.Array);  
            SortedList result1 = (SortedList)container.ResolveKeyed<IEnumerable>(ListType.Sort);

无论使用As、Named还是Keyed都可达到注册目的,根据个人喜好而定。但从功能上来讲,Autofac的设计者推荐第三种。

通过IIndex索引查找被Keyed标识过的类

如果使用Keyed方法注册类,可通过Autofac内置索引来查找指定的值,这个索引的类型是IIndex<Tkey,TValue>,以上文的枚举为例,可通过索引完成解析,代码如下:

IIndex<ListType, IEnumerable> allList = container.Resolve<IIndex<ListType, IEnumerable>>();  
            ArrayList result = (ArrayList)allList[ListType.Array];  
            SortedList result1 = (SortedList)allList[ListType.Sort];

IIndex中第一个泛型参数要跟注册时一致,这里是ListType枚举。其他两种注册方法没有这样的索引查找功能,这也是为什么设计者推荐Keyed注册的原因之一。

参考文献:http://nblumhardt.com/2010/08/the-iindexkv-relationship-type/

Ioc容器Autofac系列(3)-- 三种注册组件的方式的更多相关文章

  1. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  2. IoC容器Autofac正篇之类型注册(四)

    Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...

  3. IoC容器Autofac正篇之类型注册(五)

    Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...

  4. 【Spring】Spring之向 IOC 容器注入对象的三种方式

    关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...

  5. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  6. Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac

    经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...

  7. Ioc容器Autofac系列

    1.http://blog.csdn.net/xingxing513234072/article/details/9211969 2.asp.net mvc中整合autofachttp://blog. ...

  8. [转]Ioc容器Autofac

    本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥   前言 第一次接触A ...

  9. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

随机推荐

  1. bzoj3983

    显然我们得到这样几个结论 1.每次攻击对方一定是攻击最大的 2.自己合并也是合并最大和次大的 我们只要穷举下一开始是攻击还是合并,之后就是能攻击先攻击否则就合并 ..] of int64; var a ...

  2. Zxing 扫二维码

    1 http://blog.csdn.net/xiaanming/article/details/10163203 2 我会把一个可以运行的Demo云盘:http://pan.baidu.com/s/ ...

  3. PNG文件结构分析 ---Png解析

    PNG文件结构分析 ---Png解析   为了实现更高级的应用,我们必须充分挖掘PNG的潜力. PNG的文件结构 根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:   十进制数 13 ...

  4. squid+nginx+apache

    一.前言 二.编译安装 三.安装MySQL.memcache 四.安装Apache.PHP.eAccelerator.php-memcache 五.安装Squid 六.后记 一.前言,准备工作当前,L ...

  5. Android中ListView嵌套进ScrollView时高度很小的解决方案

    package com.example.test.util; import android.view.View; import android.view.ViewGroup; import andro ...

  6. js一些平时会用到的

    如何屏蔽页面js错误    <script language="javascript">    function killErrors()    {        re ...

  7. VS2013密匙

    在网上找到的,亲测有用: BWG7X-J98B3-W34RT-33B3R-JVYW9

  8. RESTLET开发实例(一)基于JAX-RS的REST服务

    RESTLET介绍 Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架.它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务. Restlet项 ...

  9. IOS NSNotificationCenter 通知的使用

    1.注册通知 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify) name:@" ...

  10. SQL经典笔试题之一

    本题用到下面三个关系表: CARD     借书卡.   CNO 卡号,NAME 姓名,CLASS 班级 BOOKS    图书.     BNO 书号,BNAME 书名,AUTHOR 作者,PRIC ...