autofac 注册
1 注册的概念和方式
使用autofac 的ContainerBuilder 来注册组件(components---通常指实现类),并把它的服务(service---通常指接口,抽象类,类实例)暴露给调用方。
autofac 通过相似的 Register() 方法来进行注册,通过As() 方法来公开服务
1) 创建一个ContainerBuilder 来注册组件和服务
var builder = new ContainerBuilder(); |
2) 通过反射类型来进行注册 。
builder.RegisterType<ConsoleLogger>.As<ILogger>(); |
3) 通过一个实例来进行注册
var output = new StringWriter(); |
如果用实例来注册,每次解析时,获得结果都是同一个实例。
builder.RegisterInstance(MyInstance.Instance).ExternallyOwned(); |
ExternallyOwned() 方法配置组件不会被释放。
4) 通过Lamda表达式的方式来构建注册
// Register expressions that execute to create objects... |
5) 通过RegisterGeneric()方法 支持泛型接口注册
//注册 builder.RegisterGeneric(typeof(List<>)) //解析代码 |
容器会自动根据传递的 T 类型 进行解析
6) 通过程序集进行注册
// 通过程序集进行注册 |
以上代码AsImplementedInterfaces() 方法 会把当前运行的程序集中所有实现了接口的组件进行注册,并把接口作为服务对外公开。
例如: 程序集中包含了 2个接口:IOutput 和 IDateWriter
和三个实现类:class ConsoleOutput : IOutput
class CurentDateWriter :IDateWriter
class MyComponent:IOutput,IDateWriter
那么这三个都会被注册。如果程序集中还有其他类型实现了接口,也会被自动注册,除了 IDisposable 接口。
7) 通过链式语法把一个组件注册为多个服务对外公开
// 链式注册 |
所以如下三种解析都可以正常工作
// 都可以正常执行 |
2 条件注册
1) 注册时添加筛选条件
示例1:在程序集中,通过Where() 筛选名称以“Repository” 结尾的类进行注册,并制定服务进行公开
// asm 为一个程序集变量 |
通过Where 提供Lamda 集合操作,可以对类进行筛选。
示例2 : 通过 Except() 方法排除不需要注册的类
// 排除 MyUnwantedType 不注册 |
3 Autofac 构造函数注册
1) 当组件类有多个构造函数,通过RegisterType 方法注册的组件后,解析服务时,会通过反射形式,根据构造函数参数从多到少的方式匹配。
// 多构造函数组件 |
- Autofac 根据上诉代码,在解析MyComponent 时,会先看容器中,是否有已注册的 ILoger 和IConfigReader 的 服务
- Autofac 发现只有一个ILoger 服务,而没有 IConfigReader 的服务,于是自动选择 带一个ILoger 构造参数的 构造函数实例化 M
运行结果:

2) 通过UsingConstructor()指定构造函数注册
builder.RegisterType<MyComponent>() |
- 当容器中,存在ILoger 和IDataWriter 的 注册时,当Resolve<MyComponent> 时,容器会返回2个构造函数的实例
- 当容器中,只存在Iloger 的注册时,因为是手动用2个构造函数进行祖册,此时Resolve<MyComponent> 会抛出异常,因为IDataWriter 的注册实例不存在。
4 Autofac 自动解析规则
1) 如果有多个组件注册,并以同一个服务对外公开,autofac 会取最后一个最后一个注册的组件,作为服务。
builder.Register<ConsoleLogger>().As<ILogger>(); |
以上注册代码,FileLogger 组件会被默认公开,因为它是最后一个注册为ILogger 的服务。
5 为注册组件传递参数
下面有一个读取配置节点值的 类
public class ConfigReader : IConfigReader |
1 ) 通过Lamda表达式 传递参数
builder.Register(c => new ConfigReader("sectionName")).As<IConfigReader>();
|
“sectionName” 就是传递节点名称的值。
2 ) 通过方法WithParameters 传递参数
// Using a NAMED parameter: |
autofac 注册的更多相关文章
- Autofac注册组件详解
注册概念:我们通过创建 ContainerBuilder 来注册 组件 并且告诉容器哪些 组件 暴露了哪些 服务.组件 可以通过 反射 创建; 通过提供现成的 实例创建; 或者通过 lambda 表达 ...
- 【反射】——Autofac 类型注册
Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...
- EF6CodeFirst+MVC5+Autofac泛型注册 入门实例
贴一个EF6 CodeFirst模式结合MVC5和Autofac(泛型注册)的一个入门实例 网上类似的例子实在太少,最近自己也有用到这一块的知识,总结了一下,不要让后人踩了自己踩过的坑. 1:新建三个 ...
- IoC之AutoFac(一)——简单使用和组件注册
阅读目录 一.AutoFac简单使用 二.注册 2.1 注册方式 2.2 带参数注册 回到顶部 一.AutoFac简单使用 1 namespace AutofacDemo 2 { 3 class Pr ...
- .NET手记-Autofac进阶(注册的概念 Registering Concepts)
通过创建ContainerBuilder并配置暴露的service(接口或者类型)来使用Autofac注册我们的组件. 组件(Components) 可以通过反射, 对象实例,或者lambda表达式来 ...
- AutoFac mvc和WebAPI 注册Service (接口和实现)
AutoFac mvc和WebAPI 注册Service (接口和实现) 1.准备组件版本:Autofac 3.5.0 Autofac.Integration.Mvc 3.3.0.0 (I ...
- Autofac官方文档翻译--一、注册组件--1注册概念
官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...
- IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...
- 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER
最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...
随机推荐
- C#博客记录二
1.认识运算符 我认为其中 最重要的就是逻辑运算符,对于每个人来说学习web前端就是要有一个好的思维.能够更好的运用. 2.算数运算符 变量名++意味先输出,值后增加. ++变量名意味值先增加,后输出 ...
- 使用 Azure CLI 创建虚拟机
使用 az vm create 命令创建虚拟机. 创建虚拟机时,可使用多个选项,例如操作系统映像.磁盘大小调整和管理凭据. 在此示例中,创建了一个名为“myVM”的运行 Ubuntu Server 的 ...
- lxml模块(应用xpath技术)
一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...
- HTML行内元素、块状元素和行内块状元素的区分
HTML 5 的常用元素分类 HTML可以将元素分类方式分为行内元素.块状元素和行内块状元素三种,这三者是可以互相转换的,通过display属性可以实现互相转换 (1)display:inline;转 ...
- JS基础学习——作用域
JS基础学习--作用域 什么是作用域 变量的作用域就是变量能被访问到的代码范围,比如在下面的这个js代码中,变量a的作用域就是函数foo,因此在全局作用域内的console.log(a)语句不能访问到 ...
- gsap
TweenMax借助于css,轻量级的js库 下面是简单的demo <!DOCTYPE html> <html lang="en"> <head> ...
- onload与ready差异
window.onload: 等所有资源加载完document.ready: DOM树构建完资源还没加载完 应该使用ready保证用户体验.否则当网站有很多图片资源时要很长时间才能加载完这段时间内Js ...
- Java开发中代码规范有哪些?
Java开发中所要遵守的编码规范大体上有如下7点.命名规范.注释规范.缩进排版规范.文件名规范.声明规范.语句规范以及编程规范. 1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z) ...
- ArcGIS图框生成和批量打印工具 5.2支持国家2000坐标系,支持ArcGIS10.1、ArcGIS10.2,输出图片可以是TIF和JPG
主要两个功能有:生成图框.批量输出MXD和JPG http://files.cnblogs.com/gisoracle/ScalePrint.rar 1. 批量生成标准分幅图或行政区划, ...
- Java NIO(六) Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...