Autofac官方文档翻译--一、注册组件--4组件扫描
官方文档: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"));
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>();
builder.RegisterAssemblyTypes(asm)
.As(t => t.GetInterfaces()[0]);
正如通常的组件注册,可以一起添加多个As()调用。
还添加了一些额外的注册方法,使其更容易建立共同的约定:
| 方法 | 描述 | 示例 |
|---|---|---|
AsImplementedInterfaces() |
注册类型提供所有其公共接口作为服务(不包括IDisposable接口)。 |
builder.RegisterAssemblyTypes(asm) |
AsClosedTypesOf(open) |
可分配给注册类型一个接近开放泛型类型的实例。 |
builder.RegisterAssemblyTypes(asm) |
AsSelf() |
默认: 注册类型本身 - 当重写其他服务默认规范时非常有用。 |
builder.RegisterAssemblyTypes(asm) |
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应用程序
为了避免这个问题,使用System.Web.Compilation.BuildManager中的GetReferencedAssemblies()方法,会得到一个引用程序集列表。
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
Autofac官方文档翻译--一、注册组件--4组件扫描的更多相关文章
- Autofac官方文档翻译--一、注册组件--1注册概念
官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...
- Autofac官方文档翻译--二、解析服务--2隐式关系类型
Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...
- Autofac官方文档翻译--二、解析服务--1解析参数传递
Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...
- Autofac官方文档翻译--一、注册组件--3属性和方法注入
官方文档:http://docs.autofac.org/en/latest/register/prop-method-injection.html Autofac 属性和方法注入 虽然构造函数参数注 ...
- Autofac官方文档翻译--一、注册组件--2传递注册参数
官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...
- IoC之AutoFac(一)——简单使用和组件注册
阅读目录 一.AutoFac简单使用 二.注册 2.1 注册方式 2.2 带参数注册 回到顶部 一.AutoFac简单使用 1 namespace AutofacDemo 2 { 3 class Pr ...
- WIN7 64位系统注册银行支付组件
WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...
- 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)
本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1 ...
- SpringCloud-day03-服务注册与发现组件Eureka
5.服务注册与发现组件Eureka 5.1Eureka简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中 ...
随机推荐
- 如何解决vue2.0 打包之后 打开index.html出现空白页
如何解决vue2.0 打包之后 打开index.html出现空白页 1.打包之前修改三个文件 1.1.第一步,找到build文件,在webpack.prod.conf.js 第25行左右 ...
- 排序--MergeSort 归并排序?
MergeSort 's implementation MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题 假设你有2个已经排好序的数组 数组[ 4 ][ 8 ] 和 数组 ...
- 第3.10节 Python强大的字符串格式化新功能:使用format字符串格式化
一. 引言 前面两节介绍的字符串格式化方法,都有其本身对应的缺陷,老猿不建议大家使用,之所以详细介绍主要是考虑历史代码的兼容性,方便大家理解前人留下的代码.老猿推荐大家新编码时使用format方 ...
- PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系
在界面程序开发中,数据的展示主要包括表格.简单列表.树状列表以及纯文本等多种方式,在Qt中将界面表格.简单列表.树状列表称为"表项视图类(item view class)",并提供 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中连接Action和槽函数
在Designer中试了半天,终于找到了Action添加槽函数的方法,操作步骤: 在Designer右边界面中点击鼠标右键 确保信号/槽编辑被勾选,如图是未勾选的情况:. 勾选后会出现信号和槽的编辑界 ...
- COMMENT SQL二次注入
这题目太顶了进去随便发个贴,出现登录已经提示用户名和密码了,弱密码登录(得自己去爆破)zhangwei666即可 没啥思路,扫下目录试试,kali的dirb扫到.git泄露githacker得到源码看 ...
- PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...
- Docker 基本概念(三)-生命周期详解(镜像、容器、仓库)
Docker三大组件:镜像.容器.仓库. 一.镜像 1 从仓库获取镜像 #一.从仓库获取镜像,帮助命令:docker pull -help 命令:docker pull [选项] [docker R ...
- python——sklearn完整例子整理示范(有监督,逻辑回归范例)(原创)
sklearn使用方法,包括从制作数据集,拆分数据集,调用模型,保存加载模型,分析结果,可视化结果 1 import pandas as pd 2 import numpy as np 3 from ...
- ripple Failed to load resource: the server responded with a status of 404 (Not Found)
在VS2015中使用Cordova + typescript开发中,遇到个问题. 在javascript console 中提示: Failed to load resource: the serve ...