一、装配扫描

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)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
AsClosedTypesOf(open) 注册可分配给开放泛型类型的具体实例的类型。
builder.RegisterAssemblyTypes(asm)
.AsClosedTypesOf(typeof(IRepository<>));
AsSelf() 默认值:将类型注册为它们自用,当另一个服务规范重写默认值时非常有用。
builder.RegisterAssemblyTypes(asm)
.AsImplementedInterfaces()
.AsSelf();

AutoFac(三)——装配扫描(批量注册之扫描类型)的更多相关文章

  1. Spring系列11:@ComponentScan批量注册bean

    回顾 在前面的章节,我们介绍了@Comfiguration和@Bean结合AnnotationConfigApplicationContext零xml配置文件使用Spring容器的方式,也介绍了通过& ...

  2. Autofac官方文档翻译--一、注册组件--4组件扫描

    官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...

  3. Linux常用网络工具:批量主机服务扫描之nmap

    Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. 之前已经写过常用的主机扫描和路由扫描工具,nmap支持批量主机扫描和主机服务扫描. nmap的安装直接使 ...

  4. spring概念简介、bean扫描与注册实现方式

    写在前面:本文作为整理,包含很多个人理解,有跳跃成份,初学者如果看晕了,可以先看其它同类文章,或者……多看几遍. 一.概念部分: 1.spring概念:网上有很多 2.spring核心:IOC(DI) ...

  5. spring注解扫描组件注册

    最近对单点系统进行微服务拆分,被各个springboot的组件注册搞得云里雾里的.(有的是通过springboot的自动配置进IOC容器的,有的是自己添加构造方法添加进IOC容器.)决定抽时间将spr ...

  6. Linux常用网络工具:批量主机服务扫描之netcat

    netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nma ...

  7. Spring系列之类路径扫描和注册组件-8

    目录 类路径扫描和注册组件 `@Component` 使用元注释和组合注释 自动检测类和注册 Bean 定义 使用过滤器自定义扫描 在组件中定义 Bean 元数据 命名自动检测到的组件 为自动检测的组 ...

  8. Spring学习之旅(三)--装配Bean

    装配 Bean 的方式 在 XML 中进行显式配置 在 Java 中进行显式配置 隐式的 Bean 发现机制和自动装配 Spring 提供了以上三种方式进行 Bean 的配置,可以根据自己的需求选择一 ...

  9. Vue 批量注册局部组件及应用

    博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...

  10. Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

    基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...

随机推荐

  1. 动手学深度学习-python基础知识介绍(数据处理基础流程)part2

    数据预处理 import os os.makedirs(os.path.join('..','data'),exist_ok=True) data_file=os.path.join('..','da ...

  2. js 字符串“http%3A%2F%2F”转换成http://详解

    字符串"http%3A%2F%2F"转换成http://详解 我截获下来一个URL的字符串格式是"http%3A%2F%2F",但是实际应该是http:// 而 ...

  3. thymeleaf 使用th:onclick传递参数问题:

    使用方法:注意:传递参数时如果参数是数字这样写没有问题,但是如果参数是字符串onclick的方法将无法接收到参数并报错,所以参数是字符串时要加单引号.如上图.

  4. clickhouse--表引擎

    表引擎 表引擎(即表的类型)决定了: 1)数据的存储方式和位置,写到哪里以及从哪里读取数据 2)支持哪些查询以及如何支持. 3)并发数据访问. 4)索引的使用(如果存在). 5)是否可以执行多线程请求 ...

  5. AI与.NET技术实操系列 - 开篇

    引言 在当今技术飞速发展的时代,人工智能(Artificial Intelligence, AI)已成为推动创新和变革的核心力量.从智能助手到自动化决策系统,AI的应用无处不在,深刻影响着我们的生活和 ...

  6. .NET周刊【2月第4期 2025-02-23】

    国内文章 [翻译] 为什么 Tracebit 用 C# 开发 https://www.cnblogs.com/liuliu-66/p/-/why-tracebit-is-written-in-c-sh ...

  7. AI回答(deepseek):vue3制作手机屏网站

    使用 Vue 3 制作一个适合手机屏幕的网站(移动端网站)是一个非常常见的需求.以下是一个完整的指南,帮助你从零开始构建一个移动端优化的 Vue 3 项目. 1. 创建 Vue 3 项目 使用 Vit ...

  8. GPT-4.5 感觉有点拉胯,但其实是 OpenAI 迄今为止最大的一步赌注

    Alberto Romero I. GPT-4.5 就是起跳前的助跑那一步 OpenAI 推出了 GPT-4.5(官方博客.系统卡片.演示视频),这是他们最新也是目前最大的一款 AI 模型.他们其实一 ...

  9. 【刚度矩阵推导】2d frame 单元

    2d frame 单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为: \( u=[ u_1 ,u_2 ,u_3, u_4, u_5, u_6]^{T ...

  10. excel 日期列显示到日

    原来显示 效果图: 步骤