ASP.NET Core 3.1系列(24)——依赖注入框架之Autofac

news2024/11/24 9:04:56

1、前言

前面的博客已经介绍过ASP.NET Core中内置IoC容器的使用方法。对于规模较小的项目来说,内置容器完全够用。但在实际开发业务中,一般更推荐开发者使用Autofac作为系统的IoC容器。相较于微软提供的内置容器,Autofac无论是在功能性还是灵活性上都更胜一筹,下面开始介绍它的使用方法。

2、创建接口和类

本文通过控制台程序进行演示。使用NuGet引入如下组件:

Autofac

在这里插入图片描述
创建一个IAnimal接口,代码如下:

namespace App
{
    public interface IAnimal
    {
        string GetMsg();
    }
}

创建Cat类实现IAnimal接口,代码如下:

namespace App
{
    public class Cat : IAnimal
    {
        public string GetMsg()
        {
            return "This is cat";
        }
    }
}

创建Dog类实现IAnimal接口,代码如下:

namespace App
{
    public class Dog : IAnimal
    {
        public string GetMsg()
        {
            return "This is dog";
        }
    }
}

3、Autofac基本注册方法

Autofac中包含两个关键类:ContainerBuilderIContainer。其中ContainerBuilder是一个规则构建器,主要负责类和接口的注册。IContainer相当于容器,主要通过Resolve方法提供开发者需要的对象实例。它们的实例化方式如下所示:

using Autofac;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ContainerBuilder builder = new ContainerBuilder();
            IContainer container = builder.Build();
        }
    }
}

3.1、Register注册

Autofac中的Register方法可对类和接口进行注册,下面就来注册一下IAnimal接口和Cat类,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.Register(p => new Cat()).As<IAnimal>();

            // 构建容器
            IContainer container = builder.Build();

            // 创建IAnimal实例
            IAnimal animal = container.Resolve<IAnimal>();
            Console.WriteLine(animal.GetMsg());
        }
    }
}

运行结果如下所示:

This is cat

3.2、RegisterType注册

Autofac中也可以使用RegisterType方法注册类接口和类,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<Cat>().As<IAnimal>();

            // 构建容器
            IContainer container = builder.Build();

            // 创建IAnimal实例
            IAnimal animal = container.Resolve<IAnimal>();
            Console.WriteLine(animal.GetMsg());
        }
    }
}

运行结果如下所示:

This is cat

3.3、RegisterInstance注册

Autofac提供了一个RegisterInstance方法,该方法支持实例注册,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterInstance(new Cat()).As<IAnimal>();

            // 构建容器
            IContainer container = builder.Build();

            // 创建IAnimal实例
            IAnimal animal = container.Resolve<IAnimal>();
            Console.WriteLine(animal.GetMsg());
        }
    }
}

运行结果如下所示:

This is cat

4、实例被覆盖的解决方法

一个接口可以有多个类来实现它。在上面的代码中,CatDog均实现了IAnimal接口。如果在Autofac中同时注册这两个类,则会引发实例覆盖问题,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<Cat>().As<IAnimal>();
            builder.RegisterType<Dog>().As<IAnimal>();

            // 构建容器
            IContainer container = builder.Build();

            // 创建IAnimal实例
            IAnimal animal = container.Resolve<IAnimal>();
            Console.WriteLine(animal.GetMsg());
        }
    }
}

运行结果如下所示:

This is dog

在上面的代码中,我们先注册了Cat,然后注册了Dog,此时Dog的实例就会覆盖Cat的实例。如果希望同时获取这两个类的实例,则可以使用NamedResolveNamed方法,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<Cat>().Named<IAnimal>("Cat");
            builder.RegisterType<Dog>().Named<IAnimal>("Dog");

            // 构建容器
            IContainer container = builder.Build();

            // 创建Cat实例
            IAnimal cat = container.ResolveNamed<IAnimal>("Cat");
            Console.WriteLine(cat.GetMsg());

            // 创建Dog实例
            IAnimal dog = container.ResolveNamed<IAnimal>("Dog");
            Console.WriteLine(dog.GetMsg());
        }
    }
}

运行结果如下所示:

This is cat
This is dog

5、Autofac模块的单独配置

在实际开发业务中,为了方便代码的管理,我们一般会单独建一个类来管理Autofac的模块。新建一个类IocModule,该类继承Autofac.Module,代码如下:

using Autofac;

namespace App
{
    public class IocModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<Cat>().Named<IAnimal>("Cat");
            builder.RegisterType<Dog>().Named<IAnimal>("Dog");
        }
    }
}

上面的代码重写了Load方法,我们可以在该方法中注册接口和类,最后在容器中加载IocModule 即可,代码如下:

using Autofac;
using System;

namespace App
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 注册接口和类
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterModule(new IocModule());

            // 构建容器
            IContainer container = builder.Build();

            // 创建Cat实例
            IAnimal cat = container.ResolveNamed<IAnimal>("Cat");
            Console.WriteLine(cat.GetMsg());

            // 创建Dog实例
            IAnimal dog = container.ResolveNamed<IAnimal>("Dog");
            Console.WriteLine(dog.GetMsg());
        }
    }
}

运行结果如下所示:

This is cat
This is dog

6、结语

本文主要介绍了Autofac的基础使用方法。其实Autofac中还包含一些高效灵活的注册方法,例如程序集批量注册、泛型注册等等,合理使用这些方法能够极大地提升开发效率,后续博客会对这些方法进行逐一介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Socket联机自动匹配双人五子棋(含登录注册系统与界面,数据库连接,可作结课作业,可用于学习)

1、前言 首先&#xff0c;关于源码的获取&#xff0c;本人提供了三种方式&#xff1a; 直接从文章里面CtrlC&#xff0c;CtrlV&#xff0c;然后按照我已给的文件结构搞一下即可&#xff1b;通过积分下载上传到CSDN的资源&#xff1b;点开本人的主页&#xff0c;点击“查看详细…

C语言-字符串+内存函数介绍与模拟实现(10)

目录 思维导图&#xff1a; 字符串与内存函数 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找 strstr strtok 错误信息报告 strerror perror 字符操作 内存操作函数 …

Linux之select、poll、epoll讲解

文章目录1 select、poll、epoll1.1 引言1.2 IO和Linux内核发展1.2.1 整体概述1.2.2 阻塞IO1.2.3 非阻塞IO1.2.4 select1.2.5 共享空间1.2.6 零拷贝1.3 select1.3.1 简介1.3.2 select缺点1.4 poll介绍1.4.1 与select差别1.4.2 poll缺点1.5 epoll1.5.1 epoll相关函数1.5.2 epoll优…

详解floor函数、ceil函数和round函数

1.floor函数 功能&#xff1a;把一个小数向下取整 即就是如果数是2.2 &#xff0c;那向下取整的结果就为2.000000 原型&#xff1a;double floor(doube x); 参数解释&#xff1a; x:是需要计算的数 返回值&#xff1a; 成功&#xff1a;返回一个double类型的数&#xff0c;此数…

6-星际密码

题目 星际战争开展了100年之后&#xff0c;NowCoder终于破译了外星人的密码&#xff01;他们的密码是一串整数&#xff0c;通过一张表里的信息映射成最终4位密码。表的规则是&#xff1a;n对应的值是矩阵X的n次方的左上角&#xff0c;如果这个数不足4位则用0填充&#xff0c;如…

C语言-自定义类型-结构体(11.1)

目录 思维导图&#xff1a; 1.结构体类型的基础知识 1.1结构体的声明 1.2特殊的声明 2.结构的自引用 3.结构体变量的定义和初始化 4.结构体内存对齐 4.1如何计算 4.2如何修改内对齐数 5.结构体传参 写在最后&#xff1a; 思维导图&#xff1a; 1.结构体类型的基础知…

Leetcode:98. 验证二叉搜索树(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 递归&#xff1a; 原理思路&#xff1a; 迭代&#xff08;中序&#xff09;&#xff1a; 思路原理&#xff1a; 问题描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。…

【目标检测】基于yolov6的钢筋检测和计数(附代码和数据集)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 Hello,大家好,我是augustqi。 今天给大家分享的目标检测项目是:基于yolov6的钢筋检测和计数实战项目(附代码和数据集…

如何成功发送一个Target 846 EDI报文?

Target塔吉特公司是仅次于沃尔玛的第二大零售百货集团&#xff0c;为客户提供当今时尚前沿的零售服务&#xff0c;物美价廉。而EDI&#xff08;电子数据交换&#xff09;是Target与供应商进行业务往来时要求使用的数据交换方式&#xff0c;具有安全可靠、高效和降低人工成本等优…

磨金石教育摄影技能干货分享|有哪些让你难以忘怀的人文摄影照片

在摄影分类中&#xff0c;人文摄影往往没有明确的释义。它既有纪实摄影的真实&#xff0c;又有艺术摄影的深奥。实际上&#xff0c;人文摄影可以说是二者的结合&#xff0c;在创意和表达上更倾向于艺术性&#xff0c;在画面上更有真实感。1 大雨滂沱这张肖像照极具张力&#xf…

智能家居给我们带来了什么?华秋携手信威安防传感器助力提升家居安全性

智能家居的出现&#xff0c;极大地方便了人们的生活&#xff0c;为生活提供便利舒适的体验&#xff1b;如同洗衣机与洗碗机解放了我们双手一样的道理&#xff0c;智能家居是在生活方方面面为我们了提供最大化的便利可能性。 那么&#xff0c;智能家居是如何为我们生活提供便利…

Jmeter@测试场景

目录 性能测试Jmeter&#xff0c;常用的场景 场景一&#xff1a;Thread Group 场景二、jpgc - Stepping Thread Group 场景三、jpgc - Ultimate Thread Group 场景一&#xff1a;Thread Group 参数配置-线程属性Thread Properties&#xff1a; 1.线程数(Number of Threads)…

并查集的使用

目录 一.介绍 二.并查集的实现 三路径压缩 四.相关题型 4.1省份数量 一.介绍 什么是并查集&#xff1f; 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个 单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在这个过程中要…

十五、Express 中使用JWT进行登录验证

cookie 篇 : Node.js 中 cookie的验证登录 | session 篇 : Node.js 中 session验证登录 在前面讲过了两种验证登录的方式&#xff0c;其一是cookie&#xff0c;其二是session&#xff1b;那么在讲JWT之前先来简单的回顾这两种方式区别&#xff1b;cookie和sessi…

成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】

文章目录1、出现的问题2、查看自己的npm和node版本3、解决方法3.1 寻找对应的版本3.2 升级npm版本4、再次运行项目&#xff0c;成功5、如果上述方法失败&#xff0c;请看这里早起更新代码后&#xff0c;跑前端项目。结果噶了、跑不起来了&#xff1b;不慌&#xff0c;看看日志报…

JiBX 的实操

JiBX 的实操介绍基本概念BECL 介绍JiBX 基础概念开发jar 依赖BECLJiBXPOJO 实体类OrderAddressCustomerShippingOrderFactory 工厂类使用ant 来生成XML和POJO对象的绑定关系idea 使用antant 脚本 build.xmlant 添加 build.xmlbinding.xml报错问题解决测试TestOrder测试结果 如图…

C/C++ STL

常见容器性质总结 1.vector 底层数据结构为数组 &#xff0c;支持快速随机访问 2.list 底层数据结构为双向链表&#xff0c;支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓冲区&#xff0c;详细见STL源码剖析P146&#xff0c;支持首尾&#xff08;中间 不能&…

java mybatis的SpringBoot博客论坛管理系统

java mybatis的SpringBoot博客论坛管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

Java数据结构:堆与PriorityQueue优先级队列的使用

文章目录1 什么是堆2 堆的实现思路2.1 大根堆的成员变量简介2.2 树的相关知识复习2.3 向下调整创建大根堆2.4 堆的插入2.5 堆的删除3 大根堆实现代码及测试4 PriorityQueue的使用4.1 特性简介4.2 常用方法4.3 使用PriorityQueue实现大根堆写在最后1 什么是堆 堆实质上就是对完全…

python对称加密AES的使用

python对称加密AES的使用 aes安装 pip install pycryptodome加密库引用 from Crypto.Util.Padding import pad, unpad from Crypto.Cipher import AES import base64完整代码 from Crypto.Util.Padding import pad, unpad from Crypto.Cipher import AES import base64def A…