一、Autofac简介

Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成。Autofac的主要特性如下:

  • 组件侵入性为零:组件不需要去引用Autofac。
  • 灵活的模块化系统:通过模块化组织你的程序,应用程序不用纠缠于复 杂的XML配置系统或者是配置参数。
  • 自动装配:可以是用lambda表达式注册你的组件,autofac会根据需要选择构造函数或者属 性注入
  • XML配置文件的支持:XML配置文件过度使用时很丑陋,但是在发布的时候通常非常有用
  • 组件的多服务支持:许 多设计师喜欢使用细粒度的接口来控制依赖 , autofac允许一个组件提供多个服务

二、Autofac安装

1:使用Nuget下载 “Autofac”库,需注意,使用 .net framework必须在4.7以上版本,低于4.7版本的安装会失败。

三、Autofac的注册 —— 使用类型进行注册与使用

 1 using Autofac;
2 using System;
3
4 namespace BankOperation
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 // 创建 ContainerBuilder
11 ContainerBuilder builder = new ContainerBuilder();
12
13 // 注册
14 builder.RegisterType<ABank>().As<IUnionPay>();
15
16 // 实例化
17 IContainer container = builder.Build();
18 var dev = container.Resolve<IUnionPay>();
19 dev.SaveMoneny(80);
20 dev.WithdrawMoney(50);
21
22 Console.ReadKey();
23 }
24
25 }
26
27 public interface IUnionPay
28 {
29 /// <summary>
30 /// 存钱
31 /// </summary>
32 /// <param name="amount">存钱金额</param>
33 void SaveMoneny(int amount);
34
35 /// <summary>
36 /// 取钱
37 /// </summary>
38 /// <param name="amount">取钱金额</param>
39 void WithdrawMoney(int amount);
40 }
41
42 public class ABank:IUnionPay
43 {
44 public void SaveMoneny(int amount)
45 {
46 Console.WriteLine($"把钱存入A银行,金额为:{amount}");
47 }
48
49 public void WithdrawMoney(int amount)
50 {
51 Console.WriteLine($"从A银行取钱,金额为:{amount}");
52 }
53 }
54 }

四、Autofac的注册 —— 使用别名进行注册与使用(一个接口有多个实现类时)

 1 using Autofac;
2 using System;
3
4 namespace BankOperation
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 Console.Write("请输入银行名称:");
11 string name = Console.ReadLine();
12 Operation(name);
13
14 Console.ReadKey();
15 }
16
17 static void Operation(string name)
18 {
19 // 创建 ContainerBuilder
20 ContainerBuilder builder = new ContainerBuilder();
21
22 // 使用别名进行注册
23 builder.RegisterType<ABank>().Named<IUnionPay>("A");
24 builder.RegisterType<BBank>().Named<IUnionPay>("B");
25
26 // 使用别名进行实例化
27 IContainer container = builder.Build();
28 var dev = container.ResolveNamed<IUnionPay>(name);
29 dev.SaveMoneny(80);
30 dev.WithdrawMoney(50);
31 }
32 }
33
34 public interface IUnionPay
35 {
36 /// <summary>
37 /// 存钱
38 /// </summary>
39 /// <param name="amount">存钱金额</param>
40 void SaveMoneny(int amount);
41
42 /// <summary>
43 /// 取钱
44 /// </summary>
45 /// <param name="amount">取钱金额</param>
46 void WithdrawMoney(int amount);
47 }
48
49 public class ABank:IUnionPay
50 {
51 public void SaveMoneny(int amount)
52 {
53 Console.WriteLine($"把钱存入A银行,金额为:{amount}");
54 }
55
56 public void WithdrawMoney(int amount)
57 {
58 Console.WriteLine($"从A银行取钱,金额为:{amount}");
59 }
60 }
61
62 public class BBank : IUnionPay
63 {
64 public void SaveMoneny(int amount)
65 {
66 Console.WriteLine($"把钱存入B银行,金额为:{amount}");
67 }
68
69 public void WithdrawMoney(int amount)
70 {
71 Console.WriteLine($"从B银行取钱,金额为:{amount}");
72 }
73 }
74 }

五、Autofac的注册 —— 使用Lambda进行注册与使用(传递参数时)

反射在组件创建时是个很好的选择. 但是, 当组件创建不再是简单的调用构造方法时, 事情将变得混乱起来。可通过Lambda表达式传递一个实例,通过实例的初始化函数和公共属性传递需要注入的信息:

 1 using Autofac;
2 using System;
3
4 namespace BankOperation
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 // 创建 ContainerBuilder
11 ContainerBuilder builder = new ContainerBuilder();
12
13 // 注册(通过实例化函数传递参数+类的公共属性)
14 builder.Register<IUnionPay>(c => new ABank("测试A银行"){ BankRate =8.12});
15
16 // 实例化
17 IContainer container = builder.Build();
18 var dev = container.Resolve<IUnionPay>();
19 dev.SaveMoneny(80);
20 dev.WithdrawMoney(50);
21
22 Console.ReadKey();
23 }
24
25 }
26
27 public interface IUnionPay
28 {
29 /// <summary>
30 /// 存钱
31 /// </summary>
32 /// <param name="amount">存钱金额</param>
33 void SaveMoneny(int amount);
34
35 /// <summary>
36 /// 取钱
37 /// </summary>
38 /// <param name="amount">取钱金额</param>
39 void WithdrawMoney(int amount);
40 }
41
42 public class ABank:IUnionPay
43 {
44 /// <summary>
45 /// 银行利率
46 /// </summary>
47 public double BankRate { get; set; }
48 public ABank(string name)
49 {
50 Console.WriteLine($"银行名称:{name}");
51 }
52 public void SaveMoneny(int amount)
53 {
54 Console.WriteLine($"把钱存入A银行(利率:{BankRate}%),金额为:{amount}");
55 }
56
57 public void WithdrawMoney(int amount)
58 {
59 Console.WriteLine($"从A银行取钱,金额为:{amount}");
60 }
61 }
62 }

当接口类有多个实现类,实现方式如下:

 1 using Autofac;
2 using System;
3
4 namespace BankOperation
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 Console.Write("请输入银行名称:");
11 string name = Console.ReadLine();
12 Operation(name);
13
14 Console.ReadKey();
15 }
16
17 static void Operation(string name)
18 {
19 // 创建 ContainerBuilder
20 ContainerBuilder builder = new ContainerBuilder();
21
22 // 注册(通过实例化函数传递参数+类的公共属性)
23 builder.Register(c => new ABank("测试A银行") { BankRate = 8.12 }).Named<IUnionPay>("A");
24 builder.Register(c => new ABank("测试B银行") { BankRate = 10.25 }).Named<IUnionPay>("B");
25
26 // 实例化
27 IContainer container = builder.Build();
28 var dev = container.ResolveNamed<IUnionPay>(name);
29 dev.SaveMoneny(80);
30 dev.WithdrawMoney(50);
31 }
32
33 }
34
35 public interface IUnionPay
36 {
37 /// <summary>
38 /// 存钱
39 /// </summary>
40 /// <param name="amount">存钱金额</param>
41 void SaveMoneny(int amount);
42
43 /// <summary>
44 /// 取钱
45 /// </summary>
46 /// <param name="amount">取钱金额</param>
47 void WithdrawMoney(int amount);
48 }
49
50 public class ABank:IUnionPay
51 {
52 /// <summary>
53 /// 银行利率
54 /// </summary>
55 public double BankRate { get; set; }
56 public ABank(string name)
57 {
58 Console.WriteLine($"银行名称:{name}");
59 }
60 public void SaveMoneny(int amount)
61 {
62 Console.WriteLine($"把钱存入A银行(利率:{BankRate}%),金额为:{amount}");
63 }
64
65 public void WithdrawMoney(int amount)
66 {
67 Console.WriteLine($"从A银行取钱,金额为:{amount}");
68 }
69 }
70
71 public class BBank : IUnionPay
72 {
73 /// <summary>
74 /// 银行利率
75 /// </summary>
76 public double BankRate { get; set; }
77 public BBank(string name)
78 {
79 Console.WriteLine($"银行名称:{name}");
80 }
81 public void SaveMoneny(int amount)
82 {
83 Console.WriteLine($"把钱存入B银行(利率:{BankRate}%),金额为:{amount}");
84 }
85
86 public void WithdrawMoney(int amount)
87 {
88 Console.WriteLine($"从B银行取钱,金额为:{amount}");
89 }
90 }
91 }

四、程序集注册

以上方法全部都要进行手动注册,如果有很多接口及实现类,这种一一注册的方式很麻烦,我们可以一次性全部注册,当然也可以加筛选条件。

 1 using Autofac;
2 using System;
3 using System.Collections.Generic;
4 using System.Reflection;
5
6 namespace BankOperation
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 Operation();
13
14 Console.ReadKey();
15 }
16
17 static void Operation()
18 {
19 // 创建 ContainerBuilder
20 ContainerBuilder builder = new ContainerBuilder();
21
22 //实现类所在的程序集名称
23 Assembly assembly = Assembly.Load("BankOperation");
24
25 // 获取程序集所在的全部实现类
26 builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
27
28 // t.Name.StartsWith:通过类名添加筛选条件,从类名的起始位开始匹配
29 builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.StartsWith("B")).AsImplementedInterfaces();
30
31 // 实例化
32 IContainer container = builder.Build();
33 IEnumerable<IUnionPay> banks = container.Resolve<IEnumerable<IUnionPay>>();
34
35 foreach (var item in banks)
36 {
37 item.SaveMoneny(100);
38 item.WithdrawMoney(20);
39 Console.WriteLine("-----------------------------------------------");
40 }
41 }
42
43 }
44
45 public interface IUnionPay
46 {
47 /// <summary>
48 /// 存钱
49 /// </summary>
50 /// <param name="amount">存钱金额</param>
51 void SaveMoneny(int amount);
52
53 /// <summary>
54 /// 取钱
55 /// </summary>
56 /// <param name="amount">取钱金额</param>
57 void WithdrawMoney(int amount);
58 }
59
60 public class ABank:IUnionPay
61 {
62 public void SaveMoneny(int amount)
63 {
64 Console.WriteLine($"把钱存入A银行,金额为:{amount}");
65 }
66
67 public void WithdrawMoney(int amount)
68 {
69 Console.WriteLine($"从A银行取钱,金额为:{amount}");
70 }
71 }
72
73 public class BBank : IUnionPay
74 {
75 public void SaveMoneny(int amount)
76 {
77 Console.WriteLine($"把钱存入B银行,金额为:{amount}");
78 }
79
80 public void WithdrawMoney(int amount)
81 {
82 Console.WriteLine($"从B银行取钱,金额为:{amount}");
83 }
84 }
85 }

五、引用地址

1:Autofac官网地址:https://autofaccn.readthedocs.io/zh/latest/

2:Autofac 测试用例代码:https://github.com/autofac/Autofac

3:相关博文:关于.NET中的控制反转(二)- 依赖注入之 MEF关于.NET中的控制反转(一)- 概念与定义

关于.NET中的控制反转(三)- 依赖注入之 Autofac的更多相关文章

  1. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  2. Spring中的控制反转和依赖注入

    Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...

  3. 轻松了解Spring中的控制反转和依赖注入(一)

    我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...

  4. 在DoNetMVC中使用控制反转和依赖注入【DI】

    本次是在MVC5中使用Autofac 第一步:程序包管理器控制台 Install-Package Autofac.MVC5 引入nuget包 这样成功之后,会在引用中出现两个DLL,分别是Autofa ...

  5. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  6. Java 控制反转和依赖注入模式【翻译】【整理】

    Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...

  7. spring 控制反转与依赖注入原理-学习笔记

    在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...

  8. spring(3)------控制反转(IOC)/依赖注入(DI)

    一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...

  9. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    .NET Core ASP.NET Core Basic 1-2 本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样 ...

  10. (转)Ioc控制反转和依赖注入

    转载地址:https://zhuanlan.zhihu.com/p/95869440 控制反转控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计思想,其作用是 ...

随机推荐

  1. 支持“EFDBContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    在修改数据库表后会出现 支持"EFDBContext"上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库 这个问题解决方法: 在Global.a ...

  2. Windows下MySQL无法启动万能解决方案

    MySQL启动报错 window10上安装了MySQL之前使用都是执行net start mysql 启动,执行net stop mysql关闭. 某天开始启动报错"MySQL 服务无法启动 ...

  3. js已知A,B两点坐标,在线段AB上有C点,已知AC的距离,求C点的坐标

    /** * @param {Number} _x1 A点坐标 * @param {Number} _y1 A点坐标 * @param {Number} _x2 B点坐标 * @param {Numbe ...

  4. Panda交易所视点观察:政府连发区块链建设文件,相关概念股受追捧

    日前,Panda交易所从北京市地方金融监督管理局获悉,证监会已同意在北京.苏州.上海.浙江.深圳等地区的区域性股权市场参与区块链建设工作.以上5市金融监管局将按照中国证监会的统一部署要求推进建设工作. ...

  5. 题解-TJOI2015 弦论

    TJOI2015 弦论 字符串 \(s\) 和 \(t\) 和 \(k\).如果 \(t=0\),不同位置的相同子串算 \(1\) 个:如果 \(t=1\),不同位置的相同子串算多个.求 \(k\) ...

  6. 安卓实用工具箱v4.3几百种小功能

    款多功能实用工具箱.提供了从日常.图片.查询.设备.辅助.提取.优惠券.趣味游戏等多方面的功能,操作简单,即点即用,避免您下载超多应用的难题,且应用体积轻巧,界面简洁.已去除广告! 下载地址:http ...

  7. 《Stereo R-CNN based 3D Object Detection for Autonomous Driving》论文解读

    论文链接:https://arxiv.org/pdf/1902.09738v2.pdf 这两个月忙着做实验 博客都有些荒废了,写篇用于3D检测的论文解读吧,有理解错误的地方,烦请有心人指正). 博客原 ...

  8. chrome 开发者工具使用一例

    今天搜到了一篇我想看的文章,某网站上又是弹出注册小窗遮挡,又是一堆漂浮广告,还把字体搞成灰色. 右键审查元素,找到几个div,删掉:原来那个字体的灰色,是个什么script做的遮罩,也删掉. 然后整个 ...

  9. PHP连接数据库的方式

    1,旧的方式 - mysql(面向过程) 1 <?php 2 //定义连接参数 3 $host = 'localhost'; 4 $user = 'root'; 5 $password = '' ...

  10. Python自动化办公第三方库xlwt

    Python向excel表格写入内容,首先安装第三方库: pip3 install xlwt 代码实例(结合xlrd): #!usr/bin/env python3 #!-*-coding=utf-8 ...