AutoFac(三)——装配扫描(批量注册之扫描类型)
一、装配扫描
Autofac允许通过常规组装的方式去注册组件(构造方法、实例、lambda表达式等),您可以扫描和注册单个类型,也可以具体的扫描Autofac模块去注册。
1、扫描类型
除了已知的的常见的注册或扫描,autofac也能通过用户指定的规则从程序集中注册一系列的类
如果当前有多个不同系列的组件需要注册的话,每次执行将请求一系列的一对多调用的规则是必要的
var dataAccess = Assembly.GetExecutingAssembly();
//
builder.RegisterAssemblyTypes(dataAccess)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
过滤类型
RegisterAssemblyTypes()接收一个或多个程序集的数组参数,默认情况下,所有程序集里的实体类都会被注册,这包括内部和嵌套的私有类
您可以使用提供的一些LINQ条件过滤要注册的类型集
在4.08版本有一个拓展方法的加入使得数据封装更加简单,如果你仅仅想注册公共类,可以使用:PublicOnly()
builder.RegisterAssemblyTypes(asm)
.PublicOnly();
要对已注册的类型应用自定义筛选,请使用谓词:Where()
builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"));
要通过浏览排除类型,使用:Except()
builder.RegisterAssemblyTypes(asm)
.Except<MyUnwantedType>();
也可以通过Except()自定义对特定排除类型进行注册:
builder.RegisterAssemblyTypes(asm)
.Except<MyCustomizedType>(ct =>
ct.As<ISpecial>().SingleInstance());
可以使用多个过滤器,在这种情况下,它们将与逻辑AND一起应用
builder.RegisterAssemblyTypes(asm)
.PublicOnly()
.Where(t => t.Name.EndsWith("Repository"))
.Except<MyUnwantedRepository>();
对于RegisterAssemblyTypes()的注册语法是单个类型的注册语法的超集,所以像As()这样的方法也都可以处理程序集
builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"))
.As<IRepository>();
3、实现

1、创建空接口Idenpendency及实现类
//空接口
public interface IDenpendency
{
}
InterfaceFirst继承Idenpency,DrinkHelper实现InterfaceFirst
//接口InterfaceFirst实现IDenpendency
public interface InterfaceFirst : IDenpendency
{
public void drink(string water);
}
// 定义InterfaceFirst的实现
public class DrinkHelper : InterfaceFirst
{
public void drink(string water)
{
Console.WriteLine("我在喝"+water);
} }
InterfaceSecond继承Idenpency,EatHelper实现InterfaceSecond
//接口InterfaceSecond 实现IDenpendency
public interface InterfaceSecond : IDenpendency
{
public void eat(string food);
}
// 定义InterfaceSecond的实现EatHelper
public class EatHelper : InterfaceSecond
{
public void eat(string food)
{
Console.WriteLine("我在吃" + food);
}
}
注册、解析实现
static void Main(string[] args)
{
//创建一个容器创建者
var builder = new ContainerBuilder();
//使用lambda表达式注册
var dataAccess = Assembly.GetExecutingAssembly();
Type basetype = typeof(IDenpendency); //获取顶级接口类型
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => basetype.IsAssignableFrom(t) && t.IsClass) //查询继承自顶级接口IDependency的实现类,如果没有这句,则注册所有当前运行环境中接口实现类
.AsImplementedInterfaces().InstancePerLifetimeScope();
var service = builder.Build();
using (var scope = service.BeginLifetimeScope())
{
//同时注册了InterfaceFirst、InterfaceSecond的所有实例
var interfaceDao1 = scope.Resolve<InterfaceFirst>();
interfaceDao1.drink("橙汁"); var interfaceDao2 = scope.Resolve<InterfaceSecond>();
interfaceDao2.eat("牛肉");
}
}
//执行结果,两个实例都注册成功,方法都能正常执行

//C# 反射方法 IsAssignableFrom
bool res = {TypeA}.IsAssignableFrom({TypeB}) ; //如果TypeA和TypeB类型一样则返回true; //如果TypeA是TypeB的父类则返回true; //如果TypeB实现了接口TypeA则返回true;
二、指定服务
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()的多个调用被添加到一起。 增加了一些额外的注册方法,以便于建立通用协议:
1.AsImplementedInterfaces() 是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
A:IA
builder.RegisterType<A>().AsImplementedInterfaces(); 使用时用IA,会返回一个A的实例,即将自身的实例进行注入
| 方法 | 说明 | 例子 |
| AsImplementedInterfaces() | 将该类型注册为服务提供他所有的公共接口 |
builder.RegisterAssemblyTypes(asm) |
| AsClosedTypesOf(open) | 注册可分配给开放泛型类型的具体实例的类型。 |
builder.RegisterAssemblyTypes(asm) |
| AsSelf() | 默认值:将类型注册为它们自用,当另一个服务规范重写默认值时非常有用。 |
builder.RegisterAssemblyTypes(asm) |
AutoFac(三)——装配扫描(批量注册之扫描类型)的更多相关文章
- Spring系列11:@ComponentScan批量注册bean
回顾 在前面的章节,我们介绍了@Comfiguration和@Bean结合AnnotationConfigApplicationContext零xml配置文件使用Spring容器的方式,也介绍了通过& ...
- Autofac官方文档翻译--一、注册组件--4组件扫描
官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...
- Linux常用网络工具:批量主机服务扫描之nmap
Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. 之前已经写过常用的主机扫描和路由扫描工具,nmap支持批量主机扫描和主机服务扫描. nmap的安装直接使 ...
- spring概念简介、bean扫描与注册实现方式
写在前面:本文作为整理,包含很多个人理解,有跳跃成份,初学者如果看晕了,可以先看其它同类文章,或者……多看几遍. 一.概念部分: 1.spring概念:网上有很多 2.spring核心:IOC(DI) ...
- spring注解扫描组件注册
最近对单点系统进行微服务拆分,被各个springboot的组件注册搞得云里雾里的.(有的是通过springboot的自动配置进IOC容器的,有的是自己添加构造方法添加进IOC容器.)决定抽时间将spr ...
- Linux常用网络工具:批量主机服务扫描之netcat
netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nma ...
- Spring系列之类路径扫描和注册组件-8
目录 类路径扫描和注册组件 `@Component` 使用元注释和组合注释 自动检测类和注册 Bean 定义 使用过滤器自定义扫描 在组件中定义 Bean 元数据 命名自动检测到的组件 为自动检测的组 ...
- Spring学习之旅(三)--装配Bean
装配 Bean 的方式 在 XML 中进行显式配置 在 Java 中进行显式配置 隐式的 Bean 发现机制和自动装配 Spring 提供了以上三种方式进行 Bean 的配置,可以根据自己的需求选择一 ...
- Vue 批量注册局部组件及应用
博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...
- Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...
随机推荐
- 打造有效安全闭环,天翼云MDR来了!
随着网络攻-防对抗形势愈演愈烈,传统的安全防护模式已难以应对频率暴增.昼夜不停的网络安全攻-击,提升组织安全防护能力势在必行.事实上,一些单位在网络安全建设工作中经验不足,在安全组件/设备采购方面大量 ...
- MTV和MVC模式,初识模板
MTV和MVC模式,初识模板1.MTV和MVC模式:分层级进行管理 说到框架模式我们有必要简单的说下设计模式,了解下设计模式这个概念,因为有人对设计模式和框架模式的概念经常混淆 设计模式: 是一套被反 ...
- linux系统位于 /var/log 目录下的日志文件
"/var/log"是Linux系统登录文件放置的地方,里面就是记录点日志,可以删除,不过为了句柄安全,最好删除后重启xenserver(就是重启虚拟机). 以下是位于 /var/ ...
- DP(优化)
史不分好坏.是史就应该冲进. 细节见其他题解. P10538 首先建出部分分 sub1 的图,发现是 DAG,于是设点为状态,即即将乘坐 \(j\) 车的最小代价 \(f_j\).这样的转移就是枚举上 ...
- 使用Docker编译安装运行Doris
一.编译源码 (1)拉取编译镜像docker pull apache/incubator-doris:build-env-1.2 (2)Mac电脑上拉取源码git clone https://gith ...
- 支付宝 v3 自签名如何实现
今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看. 什么是支付宝 API v3 版本? 官网上给的解释是 ...
- WinForm 进度条显示进度百分比
参考: https://blog.csdn.net/zhuimengshizhe87/article/details/20640157 WinForm中显示进度条百分比有多种方式: 1. 添加 Lab ...
- 功率MOS管的参数说明
图解功率MOS管的每一个参数! 最大额定参数 最大额定参数,所有数值取得条件(Ta=25℃) VDSS 最大漏-源电压 在栅源短接,漏-源额定电压(VDSS)是指漏-源未发生雪崩击穿前所能施加的最 ...
- Docker - 在线音乐播放器 YesPlayMusic
原文链接:https://mp.weixin.qq.com/s/D2778fnix6jAeZlCicWGdw(本文只作为跟练,不以盈利为目的) 1.下载镜像 [root@node ~]# docker ...
- Hive - 数据流转与DDL设计
数据流转设计 表的分类 按所有权分类可分为:外部表(外表)和托管表(内部表.内表). 按表的存储格式分类可分为:Text表.Orc表.Torc表.Holodesk表.Hyperbase表.ES表 按表 ...