二、注册组件

2.1、注册

  你通过创建ContainerBuilder对象来注册组件并且将组件暴露的服务告知builder。

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

  组件通过ContainerBuilder中的As()方法来暴露一个或者多个服务。

//为了注册组件而创建ContainerBuilder对象
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>();

//创建容器来完成注册工作
var container = builder.Builder();

//现在你就可以使用autofac来解析(resolve)服务了。列如
//下面代码将会执行注册IConfigReader服务的lambda表达式
using(var scope = container.BeginLifetimeScope())
{
      var reader = scope.Resolve<IConfigReader>();
}

2.1.1、反射组件

通过类型进行注册

  通过类型注册的组件,是一种典型的以反射组件:

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

  在使用基于反射进行实例化的组件时,Autofac将自动调用你注册的类中的构造函数,当然这个构造函数中的参数都必须是已经注册到容器当中的。

  比如说,有如下的一个类,类中有三个构造函数:

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

  现在以如下方式将组件和服务注册到容器中:

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

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

  当解析组件时,Autofac会发现ILogger已经被注册到容器中,但是IConfigReader并未注册。在这种情况下,第二个构造函数将被调用,该构造函数所需的参数与我们向容器中注册的组件最为匹配。

  对于反射进行创建的组件,有一个需要注意的地方:任何通过RegisterType方法注册的组件必须是一个具体类型(concrete type)。虽然可以将一个抽象类或者接口暴露为服务,但却不能讲抽象类或者接口注册为组件。这种限制的背后是有道理的:Autofac将实例化你所注册的组件,但不能new一个抽象类或接口,new的必须是抽象类或者接口的实现!

指定构造函数

  通过UsingConstructor方法以及提供表示构造函数中的参数类型的列表,你可以指定一个特定的构造函数来取代Autofac自行匹配的构造函数,比如:

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

  注意,现在任然需要提供所选构造函数必须的的参数,否则在解析(Resolve)组件时会产生一个错误。你可以在注册时传递参数,也可以在解析(Resolve)时提供参数。

2.1.2、实例组件

  在某些情况下,可能会需要一个预生成的实例并将其添加到注册组件所使用的容器中。你可以通过RegisterInstance方法来实现。

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

  当你这样做时,需要担心的是Autofac将自动销毁注册的组件,你可能希望自己控制对象的生命周期,而不是由Autofac为你调用Dispose方法。这种情况下你需要使用ExternallyOwned方法来注册实例。

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

  在一个现有应用中,已经存在一个单例模式的实例,而该单例模式的实例又被容器中的组件所依赖,使用autofac能够轻松的处理。它(单例模式的实例)可以作为一个实例注册到容器中,而不是直接将容器中的组件与该单例模式的实例进行绑定。(限于英文水平这段是我自己理解出来的,如果按原文来译的话我实在没法通顺的将其译出来,原文如下:

Registering provided instances is also handy when integrating Autofac into an existing application where a singleton instance already exists and needs to be used by components in the container. Rather than tying those components directly to the singleton, it can be registered with the container as an instance:)

builder.RegisterInstance(MySingleton.Instance).ExternallyOwned();

  容器将会取代单例模式对这个实例进行管理。

  一个实例默认暴露的服务是其具体实例的类型,参阅下面的“服务 VS 组件”。

2.1.3、表达式组件(占坑,一会继续)

时间: 2024-08-24 16:28:40

二、注册组件的相关文章

Autofac怎样注册组件(Registering Components)

在上篇Autofac基本使用步骤中,我们知道Autofac通过创建一个ContainerBuilder对象来注册组件,这个builder是通过服务来暴露组件,后续我们只需要知道服务即可,得到具体组件实例. 在Autofac中的术语请点击此链接查看==>术语 什么是组件(components)? 分三类: 1. reflection(.NET 类型, 或者泛型) 2.现成的实例.(我们创建的类型的实例) 3.Lambda表达式(执行对象实例化的匿名函数) Auotfac 为ContainerBui

Spring注解驱动开发(二)--组件注入

一.前言 上一篇我们搭建了一个简单的Spring项目,并简单的使用了 组件注册.这一篇中,我们来详细的讲解组件注入. 二.组件注入 1. @ComponentScan 在上一篇中,我们使用了@Configuration和@Bean实现了组件注入.但是如果需要注入的组件很多的情况下,每个组件都需要通过一个@Bean注解进行注入,这样就会很麻烦.所以Spring提供了@ComponentScan注解. @ComponentScan可以指定需要扫描的包,在这些包下,@Component注解标注的组件都

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();         

[翻译]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

@Configuration和@bean给容器中注册组件

spring容器中注册组件的两种方式: xml配置文件方式 注解方式 1.xml配置文件方式 编写bean类 使用xml文件配置bean注入到spring容器 通过ClassPathXmlApplicationContext类获取bean 1.1.编写bean类 package com.jcon.entity; /** * @author Jcon * @version V1.0 * @Description: (用户实体类) * @date 2019年01月28日 */ public clas

给spring容器注册组件

/** * 给容器中注册组件: * 1).包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类] * 2).@Bean[导入的第三方包里面的组件] * 3).@Import[快速给容器中导入一个组件] * 1).@Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名 * 2).ImportSelector:返回需要导入的组件的全类名数组: * 3).ImportBeanDefinitionRegi

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.给子组件定