注册组件

通过容器构造器ContainerBuilder注册组件的三种方式:

  1. 通过类型反射注册

  2. 通过现存实例注册(实现对象的实例)

  3. lambda表达式注册(通过可实例化对象的匿名函数注册)

每个组件可暴露一个或多个服务,通过ContainerBuilder中的As()方法组装

// 创建注册组件/服务的构建器。
var builder = new ContainerBuilder();

// 通过类型反射注册
builder.RegisterType<ConsoleLogger>().As<ILogger>();

// 通过实例对象注册
var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();

// 通过创建实例对象的lambda表达式注册
builder.Register(c => new ConfigReader("mysection")).As<IConfigReader>();
// 通过容器构造器ContainerBuilder创建容器
// 准备对象解析
var container = builder.Build();

// 你现在可以通过 Autofac去解析服务.比如,
//此行代码将解析并获取(执行注册的lambda表达式注册的那个)服务的依赖实例reader

using(var scope = container.BeginLifetimeScope())
{
var reader = scope.Resolve<IConfigReader>();
}

反射组件

按类型注册

通过反射生成的组件通常按类型注册

//创建容器生成器
var builder = new ContainerBuilder();
//通过反射注册的两种写法
builder.RegisterType<ConsoleLogger>();
builder.RegisterType(typeof(ConfigReader));

当使用基于反射的组件时,Autofac 会自动为您的类使用构造函数,其中包含能够从容器中获取的最多参数

例如,假设您有一个包含三个构造函数的类,如下所示:

public class MyComponent
{
public MyComponent() { Console.WriteLine("无参构造方法被调用"); }
public MyComponent(InterfaceTestA testA) { Console.WriteLine("第一个方法A被调用"); }
public MyComponent(InterfaceTestA testA, InterfaceTestB testB) { Console.WriteLine("方法A、B都被调用"); }
public void test()
{
Console.WriteLine("方法Test被调用");
}
}
 

现在假设您在容器中注册组件和服务,如下所示:

 static void Main(string[] args)
{
var build = new ContainerBuilder();
build.RegisterType<EntityImpA>().As<InterfaceTestA>();
build.RegisterType<EntityImpB>().As<InterfaceTestB>();
build.RegisterType<MyComponent>();
Console.WriteLine("Hello World!");
var containner = build.Build();
using (var scope = containner.BeginLifetimeScope())
{
//用生命周期作用域解析获取IDateWriter对应的依赖对象实例
var writer = scope.Resolve<MyComponent>();
writer.test();
}
}

当您解析您的组件cope.Resolve<MyComponent>()时,Autofac 将看到您已EntityImpA、EntityImpB注册,在这种情况下,将选择第三个构造函数

public MyComponent(InterfaceTestA testA, InterfaceTestB testB) { Console.WriteLine("方法A、B都被调用"); }

假设您在容器中注册组件和服务,如下所示:

 static void Main(string[] args)
{
var build = new ContainerBuilder();
build.RegisterType<EntityImpA>().As<InterfaceTestA>();
//build.RegisterType<EntityImpB>().As<InterfaceTestB>();
build.RegisterType<MyComponent>();
Console.WriteLine("Hello World!");
var containner = build.Build();
using (var scope = containner.BeginLifetimeScope())
{
//用生命周期作用域解析获取IDateWriter对应的依赖对象实例
var writer = scope.Resolve<MyComponent>();
writer.test();
}
}

当您解析您的组件cope.Resolve<MyComponent>()时,Autofac 将看到您已EntityImpA注册,EntityImpB没注册在这种情况下,将选择第二个构造函数

public MyComponent(InterfaceTestA testA) { Console.WriteLine("第一个方法A被调用");因为它是容器中可以找到的参数最多的构造函数。

基于反射的组件的重要说明:您注册的任何组件类型都RegisterType必须是具体类型

指定构造函数

也可以通过一个特定的构造函数来使用和重写这种自动选择的构造方法,通过UsingConstructor方法和一系列表示构造函数中参数类型的参数列表注册你的组件

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

请注意,您仍需要在解析时提供必要的参数,否则在尝试解析对象时会出现错误。您可以在注册时传递参数,也可以在解析时传递参数。

此时解析时会走的构造方法是public MyComponent(ILogger logger, IConfigReader reader) { /* ... */ }

AUTOFAC学习DEMO2-——ContainerBuilder注册三种方式、反射注册的更多相关文章

  1. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  2. PHP的学习--连接MySQL的三种方式

    记录一下PHP连接MySQL的三种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ ...

  3. AngularJs学习——实现数据绑定的三种方式

    三种方式: 方式一:<h5>{{msg}}</h5>  此方式在页面刷新的时候会闪现{{}} 方式二:<h5 ng-bind="msg">< ...

  4. Spring学习(二)三种方式的依赖注入

    1.前言 上一篇讲到第一个Spring项目的创建.以及bean的注入.当然.注入的方式一共有三种.本文将展开细说. 1.set注入:本质是通过set方法赋值 1.创建老师类和课程类 1.Course ...

  5. 【Android学习】数据传递三种方式

    1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...

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

    简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注 ...

  7. 注册Jdbc驱动程序的三种方式

    注册Jdbc驱动程序的三种方式 1. Class.forName("com.mysql.jdbc.Driver"); 2. DriverManager.registerDriver ...

  8. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  9. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  10. JDBC注册驱动的三种方式

    JDBC注册驱动的三种方式 1.通过导入的JDBC的驱动包拿到的com.mysql.jdbc.Driver对象,利用java.sql.DriverManager对象的DriverManager.reg ...

随机推荐

  1. Django项目实战:配置 setting.py

    Django项目实战:配置 setting.py Django项目的配置主要通过settings.py文件完成.这个文件位于项目的根目录下(与manage.py同级).为了让你的应用更加本地化,你可能 ...

  2. 单用户模式启动 CentOS/RHEL 7/8 的三种方法

    单用户模式启动 CentOS/RHEL 7/8 的三种方法   单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题. 通常情况下,这类问题在多用户环境中修复不了.系统可以启动但功能 ...

  3. 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员

    关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 如前所述,应用层AI开发压根不会去刻意关注大模型底层实现,多数时候也关注不了. 但我 ...

  4. 库卡机器人KR500维修保养

    随着现代工业自动化,KUKA库卡机器人以其卓越的性能.灵活的操作和高效的产出而备受赞誉.然而,为了确保机器人的持续稳定运行和延长使用寿命,应联系子锐机器人维修对库卡机器人保养至关重要. 一.库卡机器人 ...

  5. 安川MOTOMAN机器人NX100维修的注意事项

      安川MOTOMAN机器人NX100维修,操作人员安全注意事项 整个机器人的最大动作范围内均具有潜在的危险性. 为机器人工作的所有人员 (安全管理员.安装人员.操作人员和机器人维修人员) 必须时刻树 ...

  6. 不到24小时,AOne让全员用上DeepSeek的秘诀是……

    DeepSeek引发新一轮AI浪潮,面对企业数字化智能升级与数据安全红线的急迫需求,IT负责人的压力山大!如何在24小时内实现全员AI落地,同时为后续安全部署铺平道路? Step1:一键开启全员智能时 ...

  7. 【博客搭建】Latex数学书写笔记

    [博客搭建]Latex 数学书写笔记 Latex 是一种文档书写语言,支持大量的特殊字符,包括书写数学公式,并且很多 Markdown 环境都支持该语言. 布局实现 靠左:使用内联数学块$...$. ...

  8. autMan奥特曼机器人-对接deepseek教程

    一.安装插件ChatGPT 符合openai api协议的大模型均可使用此插件,包括chatgpt-4/chatgpt-3.5-turbo,可自定义服务地址和模型,指令:gpt,要求Python3.7 ...

  9. MD5 - windows也可以查询某个文件的MD5码

    命令格式 certutil -hashfile 文件名称 md5 示例 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation ...

  10. MongoDB 简单介绍

    MongoDB介绍 疑问 解答 什么是 MongoDB 一个以 JSON 为数据模型的文档数据库 为什么叫文档数据库? 文档来自于 "JSON Document",并非我们一般理解 ...