ASP.NET Core 6.0 ServiceCollection 实现依赖注入

news2024/11/27 2:21:38

ASP.NET Core6 lOC容器

控制反转(Inversion of Control, IoC)是一种软件设计模式,其目的是降低代码之间的耦合度。在C#中,可以使用依赖注入(Dependency Injection, DI)来实现控制反转。

一般系统分为 UI 层、BLL 层、DAL 层、IBLL 层 和 IDAL 层,IOC 实质是通过抽象 IBLL(接口、抽象类、普通父类)获取BLL层的实例,如果使用依赖注入,那么各层的关系如下:

内置容器 ServiceCollection 的应用

新建 Learn.NET6.Business.Interfaces 类库,新建 IMicrophone接口:

    public interface IMicrophone
    {

    }

在 Learn.NET6.ExceptionService 层添加 Microphone 类:

    public class Microphone : IMicrophone
    {
        public Microphone()
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
        }
    }

新建 Learn.NET6.DemoTest 控制台应用程序,在 Program 类中:

需要注意的是 ServiceCollection 只支持构造函数注入。

{
    //传统做法,创建一个实例
    Microphone microphone = new Microphone();
    IMicrophone microphone1 = new Microphone();

}

//内置容器:
{
    //1.创建一个容器
    //nuget 引入 Microsoft.Extensions.DependencyInjection
    ServiceCollection serviceDescriptors = new ServiceCollection();
    //2.注册抽象和具体普通类之间的关系
    serviceDescriptors.AddTransient<IMicrophone, Microphone>();
    //3. serviteDescriptors.builder
    ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();

    IMicrophone microphone = serviceProvider.GetService<IMicrophone>();
}

IOC容器-DI依赖注入

依赖注入

在创建对象的实例时,如果对象A,依赖于对象B,对象B依赖于对象C,那么在创建对象A的时候,

自动的把对象C创建出来交给对象B,再把对象B创建出来交给对象A,从而创建出对象A。

可以在全局跟一个ioc容器,配置抽象和具体普通之间的关系的时候,可以修改,这里修改了,获取实例就获取新的实例。

在 Learn.NET6.ExceptionService. 新建 AndroidPhone、ApplePhone、Headphone、Microphone、MicrophoneNew 和 Power 类,多个类且类之间互相引用:

public class AndroidPhone : IPhone
{
    public IMicrophone Microphone { get; set; }
    public IHeadphone Headphone { get; set; }
    public IPower Power { get; set; }

    public AndroidPhone()
    {
        Console.WriteLine("{0}构造函数", this.GetType().Name);
    }

    public void Call()
    {
        Console.WriteLine("{0}打电话", this.GetType().Name); ;
    }

    public void Init123456678890(IPower iPower)
    {
        Power = iPower;
    }

    public void Text()
    {
        Console.WriteLine("{0}发信息", this.GetType().Name); ;
    }

    public object QueryUser(object opara)
    {
        throw new NotImplementedException();
    }
}
public class ApplePhone : IPhone
{
    public IMicrophone Microphone { get; set; }
    public IHeadphone Headphone { get; set; }
    public IPower Power { get; set; }

    public ApplePhone(IHeadphone iHeadphone)
    {
        this.Headphone = iHeadphone;
        Console.WriteLine("{0}带参数构造函数", this.GetType().Name);
    }

    public virtual void Call()
    {
        Console.WriteLine("{0}打电话", this.GetType().Name); ;
    }

    public void Text()
    {
        Console.WriteLine("{0}发信息", this.GetType().Name); ;
    }


    public object QueryUser(object opara)
    {
        return new
        {
            Id = 123,
            Name = "Richard",
            DateTiem = DateTime.Now.ToString()
        };
    }


    public void Init123456678890(IPower iPower)
    {
        this.Power = iPower;
    }
}
    public class Headphone : IHeadphone
    {

        public Headphone(IPower power)
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
        }

    }
    public class Microphone : IMicrophone
    {
        public Microphone()
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
        }
    }
    public class MicrophoneNew : IMicrophone
    {
        public MicrophoneNew()
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
        }
    }
    public class Power : IPower
    {
        private IMicrophone Microphone;
        private IMicrophone Microphone2;

        public Power(IMicrophone microphone)
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
            this.Microphone = microphone;
        }

        public Power(int microphone)
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
        }

        public Power(IMicrophone microphone, IMicrophone microphone2)
        {
            Console.WriteLine($"{this.GetType().Name}被构造。。");
            this.Microphone = microphone;
            this.Microphone2 = microphone2;
        }
    }

 在 Learn.NET6.Business.Interfaces 新建 IHeadphone、IMicrophone、IPhone 和 IPower:

    public interface IHeadphone
    {

    }
    public interface IMicrophone
    {

    }
    public interface IPhone
    {
        void Call();

        void Text();

        void Init123456678890(IPower iPower);

        IMicrophone Microphone { get; set; }
        IHeadphone Headphone { get; set; }
        IPower Power { get; set; }
        object QueryUser(object opara);
    }
    public interface IPower
    {

    }

传统做法创建对象

{
    // 传统做法创建对象
    IMicrophone microphone = new Microphone();
    IPower power = new Power(microphone);
    IHeadphone headphone = new Headphone(power);
}

 IOC容器支持依赖注入

{
    //IOC容器支持依赖注入
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient<IMicrophone, Microphone>();
    serviceDescriptors.AddTransient<IPower, Power>();
    serviceDescriptors.AddTransient<IHeadphone, Headphone>();
    ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();

    IHeadphone headphone = serviceProvider.GetService<IHeadphone>();
}

ServiceCollection 支持的生命周期

ServiceCollection--IOC容器本质就是来创建对象的;

那么在对象创建的时候,有些特殊的场景,需要创建出来的对象有的支持单例,有的在一些范围内支持单例,面对于这些诉求,ServiceCollection支持了三种生命周期来解决这个问题。

瞬时生命周期--Transient

//一、AddTransient:瞬时生命周期,每一次创建都是一个全新的实例
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient<IMicrophone, Microphone>();
    ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone1 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone2 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone3 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone4 = serviceProvider.GetService<IMicrophone>();
    // 比较内存的引用地址,如果相同就表示同一个对象,结果是不相同
    Console.WriteLine($"microphone1 比较 microphone2:{object.ReferenceEquals(microphone1, microphone2)}");
    Console.WriteLine($"microphone1 比较 microphone3:{object.ReferenceEquals(microphone1, microphone3)}");
    Console.WriteLine($"microphone2 比较 microphone4:{object.ReferenceEquals(microphone2, microphone4)}");

}

单例生命周期--Singleton

//一、AddSingleton:单例生命周期,每一次创建都是同一个实例
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddSingleton<IMicrophone, Microphone>();
    ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone1 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone2 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone3 = serviceProvider.GetService<IMicrophone>();
    IMicrophone microphone4 = serviceProvider.GetService<IMicrophone>();
    // 比较内存的引用地址,如果相同就表示同一个对象,结果是相同
    Console.WriteLine($"microphone1 比较 microphone2:{object.ReferenceEquals(microphone1, microphone2)}");
    Console.WriteLine($"microphone1 比较 microphone3:{object.ReferenceEquals(microphone1, microphone3)}");
    Console.WriteLine($"microphone2 比较 microphone4:{object.ReferenceEquals(microphone2, microphone4)}");
}

作用域生命周期--Scoped

//一、AddScoped:作用域生命周期,同一个serviceProvider获取到的是同一个实例
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddScoped<IMicrophone, Microphone>();
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone1 = serviceProvider1.GetService<IMicrophone>();
    IMicrophone microphone2 = serviceProvider1.GetService<IMicrophone>();

    ServiceProvider serviceProvider2 = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone3 = serviceProvider2.GetService<IMicrophone>();
    IMicrophone microphone4 = serviceProvider2.GetService<IMicrophone>();

    // 比较内存的引用地址
    Console.WriteLine($"microphone1 比较 microphone2:{object.ReferenceEquals(microphone1, microphone2)}"); //True
    Console.WriteLine($"microphone3 比较 microphone4:{object.ReferenceEquals(microphone3, microphone4)}"); //True
    Console.WriteLine($"microphone1 比较 microphone3:{object.ReferenceEquals(microphone1, microphone3)}"); //False
    Console.WriteLine($"microphone1 比较 microphone1:{object.ReferenceEquals(microphone1, microphone4)}"); //False
}

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

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

相关文章

将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解

1.首先,你将你的iso的文件按照正常的流程和需求安装到你的虚拟机中,我这里使用的是vmware,安装完成之后,关机。再次点开你安装好的那台虚拟机的窗口,如下图 选中要导出的镜像,镜像需要关机 2.点击工具栏的文件------选择 导出 整个工程到 ovf 格式—这里你可以选择你要导…

LearnOpenGL——SSAO学习笔记

LearnOpenGL——SSAO学习笔记 SSAO一、基本概念二、样本缓冲三、法向半球四、随机核心转动五、SSAO着色器六、环境遮蔽模糊七、应用SSAO遮蔽因子 SSAO 一、基本概念 环境光照是我们加入场景总体光照中的一个固定光照常量&#xff0c;它被用来模拟光的散射(Scattering)。散射应…

数字图像处理【14】特征检测——Harris角点检测

在上一篇文章已经介绍了opencv特征检测中的一些必要的概念&#xff0c;介绍了什么是特征&#xff0c;什么是角点&#xff0c;这些角点特征可以做什么。今天来看看对于我们人来说很容易就识别到角点特征&#xff0c;对于计算机来说是如何识别的&#xff0c;具体的步嘴原理是怎样…

78.内存对齐

目录 一.什么是内存对齐 二.为什么要内存对齐 三.视频教程 一.什么是内存对齐 有下面例子 #include <stdio.h>struct TEST {char a;int b; };int main(void) {struct TEST test;test.a A;test.b 1;printf("sizeof %ld\n",sizeof(test));return 0;} …

JVM指令重排序

文章目录 什么是指令重排序编译器优化JIT 编译优化处理器优化重排序数据依赖性 硬件层的内存屏障指令重排的代码验证好处减少管道阻塞提高缓存利用率利用并行执行单元性能提升更好地利用硬件资源 问题内存可见性问题编程复杂性增加调试困难 解决方案&#xff1a;Java内存模型&a…

AICon 全球人工智能与机器学习技术大会参会有感

目录 引言 大会背景 大会议程 参会体验 会后感想 结束语 引言 在数字化浪潮席卷全球的今天&#xff0c;人工智能和机器学习技术已成为推动社会进步和产业升级的关键力量。作为一名对AI技术非常感兴趣的开发者&#xff0c;在 8 月 18 日至 19 日这两天&#xff0c;我有幸参…

代码随想录算法训练营43期 | Day 15——110.平衡二叉树、 257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数

代码随想录算法训练营 代码随想录算法训练营43期 | Day 15110.平衡二叉树257. 二叉树的所有路径404. 左叶子之和222. 完全二叉树的节点个数 代码随想录算法训练营43期 | Day 15 110.平衡二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

【读点论文】Adaptive degraded document image binarization,真难复现,流程有点复杂

Adaptive degraded document image binarization Abstract 本文介绍了一种新的自适应方法&#xff0c;用于对退化文档进行二值化和增强。所提出的方法不需要用户进行任何参数调整&#xff0c;并且可以处理由于阴影、不均匀照明、低对比度、大信号相关噪声、污点和应变而发生的…

Spring 的 Aop 支持

Spring 的 Aop 支持 一、AOP基本概念1_AOP基本术语2_通知类型回顾3_AOP基于代理4_SpringBoot整合AOP 二、整体流程剖析1_AspectJAutoProxyRegistrar2_AnnotationAwareAspectJAutoProxyCreator1_继承结构2_初始化时机3_AnnotationAwareAspectJAutoProxyCreator的作用时机 3_收集…

【C++】_string类字符串详细解析(1)

假如没有给你生命&#xff0c;你连失败的机会都没有。你已经得到了最珍贵的&#xff0c;还需要抱怨什么!&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;什么是string&#xff1f; •&#x1f330;1.string类的概念 •&#x1…

嘉立创PCB4层板

视频&#xff1a; 四层板PCB设计保姆级教程&#xff08;1&#xff09;&#xff1a;3.0HUB设计概述_哔哩哔哩_bilibili&#xff08;虽然是四层板实际这个还是两层板&#xff01;&#xff09; 不太建议看这个。 四层PCB 最简单终教学 高校培训课程 深入浅出 不会电路也能学会 设…

Nginx的核心!!! 负载均衡、反向代理

目录 负载均衡 1.轮询 2.最少连接数 3.IP哈希 4.加权轮询 5.最少时间 6.一致性哈希 反向代理 测试 之前讲过Nginx 的简介和正则表达式&#xff0c;那些都是Nginx较为基础的操作&#xff0c;Nginx 最重要的最核心的功能&#xff0c;当属反向代理和负载均衡了。 负载均…

YOLOv8实例分割+双目相机实现物体尺寸测量

1&#xff0c;YOLOv8实例分割原理介绍 YOLOv8是YOLO系列的最新版本&#xff0c;它在目标检测和实例分割方面都进行了显著的改进和创新。以下是YOLOv8实例分割原理的一些关键点&#xff1a; 先进的骨干和颈部架构&#xff1a;YOLOv8采用了先进的骨干和颈部架构来提高特征提取和物…

分治,1875C - Jellyfish and Green Apple

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1875C - Jellyfish and Green Apple 二、解题报告 1、思路分析 n 个苹果…

小阿轩yx-Kubernetes Pod入门

小阿轩yx-Kubernetes Pod入门 前言 Kubernetes 中 一个重要的概念就是 Pod&#xff08;豆荚&#xff09;并不直接管理容器&#xff0c;它的最小管理单元叫做 Pod。 Docker 应用中 把一个应用程序封装在一个镜像中&#xff0c;之后启动这个镜像并映射个宿主机端口号&#x…

03、Redis实战:商户查询缓存、缓存更新策略、缓存穿透、缓存雪崩、缓存击穿

2、商户查询缓存 2.1 什么是缓存? 什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器&qu…

2、Unity【基础】Mono中的重要内容

Unity基础 MonoBehavior中的重要内容 文章目录 Mono中的重要内容1、延迟函数1、延迟函数概念2、延迟函数使用3、延迟函数受对象失活销毁影响思考1 利用延时函数实现计时器思考2 延时销毁 2、协同程序1、Unity是否支持多线程2、协同程序概念3、协同程序和线程的区别4、协程的使用…

APP架构设计_1.官方应用架构指南

1.官方应用架构指南 1.1架构的原则 应用架构定义了应用的各个部分之间的界限以及每个部分应承担的职责。谷歌建议按照以下原则设计应用架构。 分离关注点通过数据模型驱动界面单一数据源单向数据流 1.2谷歌推荐的应用架构 每个应用应至少有两个层&#xff1a; 界面层 - 在屏…

近视防控明星:蔡司小乐圆中期临床数据详解

近视防控明星&#xff1a;蔡司小乐圆中期临床数据详解 小乐圆镜片作为近视防控镜片里的明星产品&#xff0c;从22年5月上市以来防控效果就一直备受大家的关注。而最近中期临床试验的结果&#xff0c;给家长孩子吃了一颗定心丸。 本次实验中&#xff0c;240位受试者被随机分成三…

基于springboot框架的电影订票系统_wqc3k

TOC springboot611基于springboot框架的电影订票系统_wqc3k--论文 绪 论 1.1研究背景和意义 随着科学技术的不断发展&#xff0c;计算机现在已经成为了社会的必需品&#xff0c;人们通过网络可以获得海量的信息&#xff0c;这些信息可以和各行各业进行关联&#xff0c;电影…