官方文档:http://docs.autofac.org/en/latest/register/scanning.html

Autofac 组件扫描

在程序集中Autofac 可以使用约定来找到并注册组件,你可以扫描并注册自定义类型或者为Autofac 模块专门进行扫描。

1、扫描类型

在其他方面,被称为约定驱动的注册或扫描,Autofac可以根据用户指定的规则从一个程序集中注册一组类型:
var dataAccess = Assembly.GetExecutingAssembly();

builder.RegisterAssemblyTypes(dataAccess)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
每个RegisterAssemblyTypes() 调用将适用一组规则,如果有多种不同的组件注册,一次或多次调用RegisterAssemblyTypes() 是非常有必要的。
  • 过滤类型(Filtering Types)

RegisterAssemblyTypes()接受一个或多个程序集的参数数组。默认情况下,程序集中的所有的公共的,具体类将被注册。你可以过滤一组注册的类型,通过使用linq表达式。
过滤注册类型,使用Where()语法过滤:
builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"));

从扫描排除类型,可以使用Except():
builder.RegisterAssemblyTypes(asm)
.Except<MyUnwantedType>();

Except() 允许你自定义特定的排除类型来注册

builder.RegisterAssemblyTypes(asm)
.Except<MyCustomisedType>(ct =>
ct.As<ISpecial>().SingleInstance());
可以使用多个过滤器,在这种情况下,他们通过AND来追加。
  • 指定服务(Specifying Services)

对于RegisterAssemblyTypes()注册语法是单个类型注册语法的超级集合,所以像As()方法都将在程序集中很好的工作:

builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"))
.As<IRepository>();
重写As()和Named()方法由接受的lambda表达式决定,对应一个类型,此类型将提供哪个服务:
builder.RegisterAssemblyTypes(asm)
.As(t => t.GetInterfaces()[0]);

正如通常的组件注册,可以一起添加多个As()调用。

还添加了一些额外的注册方法,使其更容易建立共同的约定:

方法 描述 示例
AsImplementedInterfaces()

注册类型提供所有其公共接口作为服务(不包括IDisposable接口)。

builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
AsClosedTypesOf(open)

可分配给注册类型一个接近开放泛型类型的实例。

builder.RegisterAssemblyTypes(asm)
.AsClosedTypesOf(typeof(IRepository<>));
AsSelf() 默认: 注册类型本身 - 当重写其他服务默认规范时非常有用。
builder.RegisterAssemblyTypes(asm)
.AsImplementedInterfaces()
.AsSelf();

2、扫描模块

模块扫描使用RegisterAssemblyModules()注册方法执行,它的名字是什么,就执行哪个。它通过Autofac 模块提供的程序集扫描,创建模块实例,然后使用当前container builder 注册他们。
例如,两个简单的模块类属于同一程序集并且每个注册一个组件:
public class AModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => new AComponent()).As<AComponent>();
}
} public class BModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => new BComponent()).As<BComponent>();
}
}
RegisterAssemblyModules()重载不接受类型参数,在提供的程序集列表中找到的实现了IModule的所有类都将被注册。在下面的例子中,两个模块都将被注册: 
var assembly = typeof(AComponent).Assembly;
var builder = new ContainerBuilder(); // 注册两个模块
builder.RegisterAssemblyModules(assembly);
RegisterAssemblyModules()使用泛型类型参数重载,允许你指定一个基本类型这个模块必须从其派生。在下面的例子中,只有一个模块被注册,因为扫描被限制:
var assembly = typeof(AComponent).Assembly;
var builder = new ContainerBuilder(); // 只注册 AModule 但是不会注册 BModule
builder.RegisterAssemblyModules<AModule>(assembly);
RegisterAssemblyModules()使用object类型参数重载,就像泛型类型参数重载,但允许你指定类型,它可能在运行时确定。在下面的例子中,仅一个模块被注册,因为扫描被限制:
var assembly = typeof(AComponent).Assembly;
var builder = new ContainerBuilder(); // 只注册AModule 不会注册 BModule
builder.RegisterAssemblyModules(typeof(AModule), assembly);

3、IIS托管Web应用程序

当使用IIS应用程序集扫描,配置程序集的位置可能会遇到一点小麻烦。
当在IIS托管应用程序,当第一次启动应用程序时,所有程序集被加载到AppDomain中,但是当AppDomain被IIS回收时,程序集仅按需加载。

为了避免这个问题,使用System.Web.Compilation.BuildManager中的GetReferencedAssemblies()方法,会得到一个引用程序集列表。

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
这将迫使引用的程序集被加载到应用程序域立即使其可用于模块扫描。

Autofac官方文档翻译--一、注册组件--4组件扫描的更多相关文章

  1. Autofac官方文档翻译--一、注册组件--1注册概念

    官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...

  2. Autofac官方文档翻译--二、解析服务--2隐式关系类型

    Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...

  3. Autofac官方文档翻译--二、解析服务--1解析参数传递

    Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...

  4. Autofac官方文档翻译--一、注册组件--3属性和方法注入

    官方文档:http://docs.autofac.org/en/latest/register/prop-method-injection.html Autofac 属性和方法注入 虽然构造函数参数注 ...

  5. Autofac官方文档翻译--一、注册组件--2传递注册参数

    官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...

  6. IoC之AutoFac(一)——简单使用和组件注册

    阅读目录 一.AutoFac简单使用 二.注册 2.1 注册方式 2.2 带参数注册 回到顶部 一.AutoFac简单使用 1 namespace AutofacDemo 2 { 3 class Pr ...

  7. WIN7 64位系统注册银行支付组件

    WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...

  8. 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)

    本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1  ...

  9. SpringCloud-day03-服务注册与发现组件Eureka

    5.服务注册与发现组件Eureka 5.1Eureka简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中 ...

随机推荐

  1. Mac 上超好用的代码对比工具 beyond compare,对比json差异

    导读 昨天下午,公司业务跑不通,然后开发组长让架构师联系我,给我发一个json和部署到dev上的微服务url,让我去测试下,将发来的json放到json.cn上愣是解析不出来,我就用之前的json请求 ...

  2. C语言讲义——数组

    数组是: 一组数据 一组类型相同的数据 在计算机底层,数组是一块连续的内存 为什么使用数组? 一年12个月 int m1=1, m2=2, m3=3, ... 麻烦 数组示例: #include &l ...

  3. 集群--lvs

    快一个月没有更新博客了,最近一段时间在忙世界技能大赛网络系统系管理这个项目,没有太多的时间,我百忙之中更新一下.最近赛题中有说到集群这个,lvs这个东西(我也该学学这个了,一直停留在基础部分,是时候学 ...

  4. DRF的ModelSerializer的使用

    在views中添加 from django.shortcuts import render # Create your views here. from rest_framework.views im ...

  5. go语言数据类型值--整型和浮点型

    一.整型 1.整型的分类: 有符号整型: int8.int16.int32.int64 对应的无符号整型: uint8.uint16.uint32.uint64 uint就是我们熟知的byte类型,i ...

  6. 第3.11节 Python强大的字符串格式化新功能:format字符串格式化的格式控制

                                                第3.11节 format字符串格式化的格式控制 一.    引言 上节介绍了四种format进行字符串格式化的 ...

  7. 第11.2节 Python 正则表达式支持函数概览

    为了大家熟悉re模块匹配文本的处理,本节将概要介绍与此处理有关的几个主要函数,提供了如下主要函数: 以上函数中的部分的三个重要参数说明如下: pattern都是代表匹配规则的模式字符串,string代 ...

  8. PyQt(Python+Qt)学习随笔:QTreeView树形视图的indentation属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的indentation属性用于控制视图中每级数据项之间的缩进,对于顶级项 ...

  9. javascript:void(0)用法和常见问题

    javascript:void(0)的用法 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javascript 上没有任何效果. <a H ...

  10. HTML5中的自定义属性data-*

    在html5中,给元素添加自定义属性需要用到data-*,比如data-name,添加完data-自定义属性之后通过元素的dataset属性来访问其值. dataset与getAttribute/se ...