Autofac怎样注册组件(Registering Components)

在上篇Autofac基本使用步骤中,我们知道Autofac通过创建一个ContainerBuilder对象来注册组件,这个builder是通过服务来暴露组件,后续我们只需要知道服务即可,得到具体组件实例.

在Autofac中的术语请点击此链接查看==>术语

什么是组件(components)?

分三类:

  1. reflection(.NET 类型, 或者泛型)

  2.现成的实例.(我们创建的类型的实例)

  3.Lambda表达式(执行对象实例化的匿名函数)

Auotfac 为ContainerBuilder提供Register()家族方法设置注册组件,每个组件通过调用 ContainerBuilderAs()方法来暴露一个或者多个服务。

//创建一个用于注册组件/服务的Builder.
var builder = new ContainerBuilder();//注册一个类型
builder.RegisterType<ConsoleLogger>.As<ILogger>();

// 注册一个现成的实例var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();

// 注册一个执行创建对象的表达式.
builder.Register(c => new ConfigReader("mysection")).As<IConfigReader>();
//构建一个container来完成注册动作,同时保存这个container来以备后面解析对象.
var container = builder.Build();
//现在我们可以解析服务,等到我们想要是实例.
using(var scope = container.BeginLifetimeScope())
{
  var reader = container.Resolve<IConfigReader>();
}

  1. 一.Reflection 组件

    有2个注册Reflection的方法,一个是泛型方法,一个普通的方法(传入的参数类型是Type类型).

下面是这个2个注册方法.

var builder = new ContainerBuilder();
builder.RegisterType<ConsoleLogger>();
builder.RegisterType(typeof(ConfigReader));

  当使用基于Reflection 组件时,Autofac 会自动使用这个类参数最多的构造函数,这个参数必须能够从Container中解析得到.
例如:

我有这么个类.

public class MyClass
{
    public MyClass() { /* ... */ }
    public MyClass(ILogger logger) { /* ... */ }
    public MyClass(ILogger logger, IConfigReader reader) { /* ... */ }
}

然后我在Aufo进行组件注册:

var builder = new ContainerBuilder();
builder.RegisterType<MyClass>();
builder.RegisterType<ConsoleLogger>().As<ILogger>();
var container = builder.Build();

using(var scope = container.BeginLifetimeScope())
{
  var component = container.Resolve<MyComponent>();
}

  这个时候,找到参数最多的构造函数是MyClass类的第2个构造函数,而不第3个. 因为我们注册了ILogger服务的组件,而没有注册IConfigReader服务的组件.所以container能解析到构造器的一个参数,因此Aufofac自动选择了第2个构造函数.
  我也可以改变Aufofac自动选择构造函数的行为,从而实现手动选择.UsingConstructor方法能够满足我们的要求.

builder.RegisterType<MyClass>()
       .UsingConstructor(typeof(ILogger), typeof(IConfigReader));

基于Reflection组件总结:

1.任何组件类型都必须通过"RegisterType"方法注册,而且注册的类型必须是一个具体的类型,不能是接口或者抽象类型.虽然我们可以暴露一个接口或抽象类作为服务,但不能把他们作为组件注册.

2.我可以使用UsingConstructor方法改变Autofac自动选择构造器的特性.



 二. 实例组件.

我们可以通过"RegisterInstance"方法把已经创建的对象的实例注册到服务上.通过服务,暴露给大家使用.

var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();


三.Lambda表达式组件
Reflection 组件是和很好的选择,但是有些时候,组件的创建逻辑不是简单的构造器调用,而是一个复杂的逻辑,因此Autofac允许用委托或者Lambda表达式作为一个组件的创建者.

builder.Register(c => new A(c.Resolve<B>()));

说明: 在上面代码中,可以看到有一个c参数提供给表达式,这个参数是组件上下文(IComponentContext类型对象),我们可以在表达式中使用它从Container中解析出你创建组件是所需要的实例.

时间: 2024-09-30 03:15:53

Autofac怎样注册组件(Registering Components)的相关文章

Vue 全局注册组件和局部注册组件

Vue 组件化的思想大大提高了模块的复用性和开发的效率,在使用组件时,一般分为几个步骤,分别是:定义组件.引入组件,注册组件,使用组件.本节主要针对Vue中如何注册组件进行阐述. 下面我们一起来看如何全局注册组件,如何局部注册组件. 页面显示结果如下: [说明]: 1. com-one  com-two 为全局注册组件, com-three  com-four 为局部注册组件: 2. 全局注册组件为 Vue.component()方法:局部注册组件为 components 属性,它的属性值是一个

.NET手记-Autofac进阶Registering Components

通过创建ContainerBuilder并配置暴露的service(接口或者类型)来使用Autofac注册我们的组件. 组件(Components) 可以通过反射, 提供对象实例化,或者通过lambda表达式来创建. ContainerBuilder有一系列的Register()方法来实现组件的注册. ContainerBuilder中每个组件都能通过As()方法来暴露他们一个或多个service. // Create the builder with which components/serv

autofac v4.0+通过配置文件的方式注册组件

最近在看李玉宝 / OpenAuth.Net的项目代码,新手表示看不懂.所以,不管三七二十一,模仿是最好的学习,于是我决定自己创建一个项目,把人家的代码一点一点拷贝过来,细细品味. 在研究的过程中,我发现大神用autofac是通过配置文件的方式.Autofac.Configuration的版本是V3.3,然后我创建的项目用的是V4.0.1. 本来是想用代码注册组件的,但是以看到大神是通过配置文件注册的,于是乎,不管三七二十一,我就定下了一个小目标,我要用v4.0.1版本来完成使用配置文件的方式来

Ioc容器Autofac系列(3)-- 三种注册组件的方式

简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注册共有三种方式,其中最简单的就是用As方法,例如,ArrayList继承了IEnumerable接口,若将其注册到Autofac中,写法如下所示: 双击代码全选 1 2 3 4 5 ContainerBuilder builder = new ContainerBuilder();         

二、注册组件

2.1.注册 你通过创建ContainerBuilder对象来注册组件并且将组件暴露的服务告知builder. 组件可以通过反射来进行创建(通过注册一个特定的.NET类型或者开放的泛型(by registering a specific .NET type or open generic)):通过提供现成的实例(你创建的对象的一个实例):或者通过lambda表达式(通过一个匿名方法来执行对象的创建).你可以通过ContainerBuilder中一系列重载的Register()方法来设置创建组件的

vue和react之间关于注册组件和组件间传值的区别

注册组件 Vue中:1.引入组件:2.在components中注册组件:3.使用组件; React中:1.引入组件:2.使用组件; 子父传值 Vue中: 父组件向子组件传值: 1.在父组件中绑定值:2.子组件通过在props中接收值:3.正常使用; 子组件向父组件传值 1.子组件通过this.$emit订阅:2.父组件通过v-on监听: React中: 父组件向子组件传值: 1.在父组件中直接写值:2.在子组件中通过this.props.接收值: 子组件向父组件传值: (方法一) 1.给子组件定

【ExtJS 4.x学习教程】(4)组件(Components)

作者:周邦涛(Timen) Email:[email protected] 转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27366477 1. 简介 一个Ext JS 应用的UI是由一个或多个叫做组件(Component)的小部件组成的.所有的组件都是Ext.Component的子类,Ext.Component可以使其子类参与自动化的声明周期管理,包括初始化.渲染.调整大小及位置和销毁.Ext JS提供了大量的直接可用的组

[翻译]Component Registration in Script System 在脚本系统中注册组件

Component Registration in Script System 在脚本系统中注册组件   To refer to our component from a script, the class, its properties and methods must first be registered in the script system. You may place the registration code in a file with the same name as the

vue中注册组件

注册组件,其实就是自定义标签(一堆标签堆在一起去现实某一个功能,可以类似成方法去理解) 注册组件,有2种 1:全局注册(全局注册的组件可以在任意的vue实例中使用) 2:局部注册(局部注册的组件只能在当前的vue实例中使用) 例如: 全局组件: 注意:全局组件可以在任意的vue实例中使用,这样就可以实现代码的复用的好处了. 局部组件: 顾名思义:只能在当前注册它的vue实例中使用它. 注意:对于组件的命名,W3C规范是字母小写且包含一个短横杠'-'. 原文地址:http://blog.51cto