.Net Core 6.0依赖注入

news2024/10/9 20:30:11

.Net Core 6.0依赖注入

往期文章:

  1. .ner Core实现接口限流
  2. .net Core程序发布到IIS(Window Server 2019)

文章目录

  • .Net Core 6.0依赖注入
  • 前言
  • 一、ICO 和DI和DL
    • ICO [控制反转]
    • DI [依赖注入]
    • DL [依赖查找]
  • 二、.net Core 中的依赖注入【Autofac】
    • 瞬时模式
    • 作用域模式
    • 单例模式
    • 尝试注册
    • 移除和替换注册
    • 注册泛型模板
  • 三、使用依赖注入注意点:
  • 四、实现 IDisposable 接口类型的释放
  • 五、Autofac与.netCore自带的依赖注入对比
    • 基于名称的注入
    • 属性注入
    • 子容器
    • 基于动态代理的 AOP
  • 六、.netCore 6.0 中依赖注入的使用


前言

相信大家在学习.net Core的时候都听说过依赖注入,和控制反转等概念。随着.net Core 6.0的到来,相比于之前的.net Core 3.1 做了不小的改变,依赖注入的方式也和之前的方式有些许不同,但是万变不离其宗,如果你会用.net Core 3.1那.net Core 6.0应该也能很快上手,不会.net Core 3.1的同学也不用担心,相信你看了下面的教程也能学会如果依赖注入。


一、ICO 和DI和DL

学习.net Core 的同学都应该听说过这两个东西。那么他们分别是什么呢?他们呢各自的作用又是什么呢?接下来我就来给大家讲解一下。

ICO [控制反转]

ICO:它的全称是【Inversion of Control】翻译过来就是控制反转。

大佬是这样说的:

所谓控制反转,反转的是类与类之间依赖的创建。类型A依赖于类型B时,不依赖于具体的类型,而是依赖于抽象,不在类A中直接 new 类B的对象,而是通过外部传入依赖的类型对象,以实现类与类之间的解耦

好像不太好理解,给大家举个例子:

比如你去你妹妹家串门,而她做的饭巨难吃,你就自己带着一同泡面去串门,吃饭的时候就吃自己带的这桶泡面。此时你就实现了控制反转,不用吃你妹妹做的黑暗料理了。

DI [依赖注入]

DI:它的全称是【Dependency Injection】翻译过来就是依赖注入。
大佬的解释是:

所谓依赖注入,就是由一个外部容器对各种依赖类型对象进行管理,包括对象的创建、销毁、状态保持等,并在某一个类型需要使用其他类型对象的时候,由容器进行传入。

好像还是不太好理解,再给大家举个例子:

比如你要出去旅行,把牙刷,毛巾,出行所需的衣物和鞋子等东西装入背包,这些物品都是你此次旅行可能需要的东西也就是依赖。你把它装入背包的过程就可以理解为依赖注入。

DL [依赖查找]

DL:它的全称是【Dependency Lookup】翻译过来是依赖查找。
大佬是这样描述它的:

它是控制反转设计原则的一种实现方式。它的大体思路是:容器中的受控对象通过容器的 API 来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的 API,造成了我们无法在容器外使用和测试对象。依赖查找是一种更加传统的 IOC 实现方式。
依赖查找也有两种方式:

  1. 依赖拖拽:注入的对象如何与组件发生联系,这个过程就是通过依赖拖拽实现;
  2. 上下文依赖查找:在某些方面跟依赖拖拽类似,但是上下文依赖查找中,查找的过程是在容器管理的资源中进行的,而不是从集中注册表中,并且通常是作用在某些设置点上;(JNDI)

这个就很好理解了就不用给大家举例子了。

二、.net Core 中的依赖注入【Autofac】

Autofac 中依赖的三种生命周期:

瞬时模式

  • Transient:瞬时模式,每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例,它会在这个请求处理结束后被释放

示例:

 services.AddTransient<IWebService, WebService>();

作用域模式

  • Scoped:作用域模式,每个客户端请求(连接)创建一次。同一个请求获取多次会得到相同的实例,它也会在这个请求处理结束后被释放

示例:

 services.AddScoped<IWebService, WebService>();

单例模式

  • Singleton:单例模式,每次都获取同一个实例,它会在根容器释放的时候释放

示例:

 services.AddSingleton<IWebService, WebService>();

权重大小对比:Singleton>Transient>Scoped

注入形式展示:

  1. 直接注入实例
 services.AddScoped<IMyService>(new MyService());

  1. 工厂模式注册
 services.AddScoped<IMyService>(serviceProvider =>
 {
    return new MyService();
 });
  1. 注册不同示例
 services.AddScoped<IMyService>(new MyService());
 services.AddScoped<IMyService>(new MyService2());

尝试注册

尝试注册会先判断实例是否已经注册,若注册了则不再进行注册;尝试注册可以有效的避免服务重复注册。

 services.TryAddScoped<IMyService>(new MyService());
 services.TryAddEnumerable(ServiceDescriptor.Scoped<IMyService, MyService>());

移除和替换注册

替换注册可以替换原有实例注册MyService为MyService2,RemoveAll则是移除所以实现了IMyService的注册实例。

 services.AddScoped<IMyService, MyService>();
 services.Replace(ServiceDescriptor.Singleton<IMyService, MyService2>());
 services.RemoveAll<IMyService>();

注册泛型模板

 services.AddScoped(typeof(IGenericService<>), typeof(GenericService<>));

三、使用依赖注入注意点:

  • 避免通过静态属性的方式访问容器对象
  • 避免在服务内部使用 GetService 方式来获取实例
  • 避免使用静态属性存储单例,应该使用容器管理单例对象
  • 避免在服务中实例化依赖对象,应该使用依赖注入来获得依赖对象
  • 避免向单例的类型注入范围的类型

四、实现 IDisposable 接口类型的释放

  • DI 只负责释放由其创建的对象实例
  • DI 在容器或子容器释放时,释放由其创建的对象实例
  • 避免手动创建实现了 IDisposable 对象,应该使用容器来管理其生命周期

五、Autofac与.netCore自带的依赖注入对比

Autofac的功能比.Net Core 的原生依赖注入更丰富,具体表现在:

  • 基于名称的注入
  • 属性注入
  • 子容器
  • 基于动态代理的 AOP

基于名称的注入

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterType<MyService>().Named<IMyService>("s1");
    builder.RegisterType<MyService2>().Named<IMyService>("s1");
}

从IoC容器中使用ResolveNamed获取:

var s1 = container.ResolveNamed<IMyService>("s1");
var s2 = container.ResolveNamed<IMyService>("s2");

属性注入

用PropertiesAutowired方法支持属性注入:

builder.RegisterType<MyService>().As<IMyService>().PropertiesAutowired();

子容器

builder.RegisterType<MyService>().InstancePerMatchingLifetimeScope("myscope");

子容器的使用:

var autofacContainer = app.ApplicationServices.GetAutofacRoot();
using (var myscope = autofacContainer.BeginLifetimeScope("myscope"))
{
    var service1 = myscope.Resolve<MyService>();
    using (var scope = myscope.BeginLifetimeScope())
    {
        var service2 = scope.Resolve<MyService>();
        Console.WriteLine($"service1=service2:{service1 == service2}");
    }
}

基于动态代理的 AOP

需要引用包:Autofac.Extras.DynamicProxy
先实现一个拦截器继承 IInterceptor

    public class MyInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine($"Intercept before,Method:{invocation.Method.Name}");
            invocation.Proceed();
            Console.WriteLine($"Intercept after,Method:{invocation.Method.Name}");
        }
    }

注册

builder.RegisterType<MyService>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();

这里实现了基于接口的拦截,也可以实现基于类的拦截;基于类的拦截时,方法需要定义为虚方法。

示例代码搬运自:Aoss丶的博客->.Net Core 依赖注入

六、.netCore 6.0 中依赖注入的使用

  1. 第一步、添加依赖注入的两个关键包:
    Autofac.Extensions.DependencyInjection 和 Autofac.Extras.DynamicProxy
    在这里插入图片描述

  2. 第二步、重写load方法:
    这种方法式为了配合程序集注入的
    这里注意:根据名称约定 查询到的程序集 的命名规则必须规范 否则可能读取不到 对应的数据集 从而报错在这里插入图片描述

  3. 第三步,在Program.cs中注册:

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
    //第一种方式 实现和接口方式注入
    builder.RegisterType<LoginServices>().As<ILoginServices>();
    //第二中调用程序集注入(引用式)
    builder.RegisterModule(new AutofacModuleRegister());

    //第二种注入方式  程序集注入(反射式)
    var assemblysServices = Assembly.Load("AutofacModuleRegister");
    builder.RegisterAssemblyTypes(assemblysServices)
               .AsImplementedInterfaces()
               .InstancePerLifetimeScope();

});
  1. 第四步,在构造函数中注入:
    在这里插入图片描述

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

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

相关文章

中文输入法开发-关键代码

续上篇介绍了嵌入式Linux下中文输入法&#xff0c; 嵌入式Linux下开发中文输入法_嵌入式输入法_小刚学長的博客-CSDN博客 本篇继续介绍核心关键功能 展现效果图如下&#xff1a; 1、如何跟应用关联起来&#xff0c;比如说&#xff0c;希望当LineEdit 输入状态激活后&#xff0…

怎么清空回收站?3个方法轻松搞定!

有没有大佬知道该怎么清空回收站呀&#xff1f;想把回收站清空了不知道该如何操作&#xff01;求一个清空方法&#xff01;感谢大家啦&#xff01; 电脑的回收站会为我们保存一些删除的数据&#xff0c;如果我们删除文件后意识到这些文件仍然是有用的&#xff0c;可以利用回收站…

报考CDGP一定要先有CDGA证书吗?

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行&#xff0c;报名通道现已开启。 最近好多想报名CDGP认证考试的朋友都来咨询考试报名事宜&#xff0c;其中有一个重合度很高的问题“报考CDGP一定要先有CDGA证书吗&#xff…

【leetcode难题】2569. 更新数组后处理求和查询【线段树实现01翻转和区间求和模版】

题目截图 题目分析 关键就是记录每次操作2时&#xff0c;nums1中的1的个数这就需要实现线段树进行区间反转以及区间求和 ac code class Solution:def handleQuery(self, nums1: List[int], nums2: List[int], queries: List[List[int]]) -> List[int]:n len(nums1)m le…

校企合作谱新篇︱西藏农牧学院水土学院与鹏业软件签署校企合作协议

2023年7月17日&#xff0c;西藏农牧学院水利土木工程学院&#xff08;以下简称“水土学院”与成都鹏业软件股份有限公司&#xff08;以下简称“鹏业软件”&#xff09;在西藏林芝签署校企合作协议并揭牌。水土学院副书记、院长王培清、副院长孙海波、土木教研室主任宗永臣、土木…

【SpringBoot应用篇】SpringBoot+MybatisPlus集成国产DM8(达梦)数据库

【SpringBoot应用篇】SpringBootMybatisPlus集成国产DM8&#xff08;达梦&#xff09;数据库 简介和安装基本概念介绍SpringBootMP整合DM8pomymlAddressAddressMapper启动类测试类增删改查 yml配置与实体类TableName表映射问题 简介和安装 DM8 是达梦数据库有限公司推出的新一…

AI加速游戏开发 亚马逊云科技适配3大场景,打造下一代游戏体验

随着疫情的消散&#xff0c;中国游戏产业正在快速前进。在伴随着游戏产业升级的同时&#xff0c;整个行业都在面临着新的挑战与新的诉求。亚马逊云科技游戏研发解决方案和服务&#xff0c;覆盖端到端3大场景&#xff0c;为游戏公司与游戏开发人员赋能。 场景1&#xff1a;AI辅助…

memcached最大的优势是什么?

在Java中使用Memcached的最大优势之一是它提供了高性能的分布式缓存解决方案。Memcached是一个简单、快速、开源的内存缓存系统&#xff0c;可以帮助加速应用程序的访问速度&#xff0c;减轻数据库的负担&#xff0c;提高应用的扩展性和吞吐量。它常用于缓存频繁读取的数据&…

仿微信开发

介绍 一款仿微信界面的即时通讯APP, 采用uniapp开发(uview1.x版本),后端采用java.(springbootwebsocket) ####功能支持 1:添加好友,单聊,群聊群组的发起 2:支持文字,表情,语音,图片,文件信息的收发,离线消息推送仅限安卓(ios没证书,安卓需要自行申请unipush) 3:支持发送红包…

高压开关柜无线测温系统设计与实现 安科瑞 许敏

摘要&#xff1a;文章提出了一种用于小车式开关柜的无线测温系统&#xff0c;包括设于小车动触头套管上的温度传感器、环绕设于小车动触头上的电流传感器&#xff0c;温度传感器及电流传感器均分别连接有数据接收处理器&#xff0c;数据接收处理器电连接有设于小车式开关柜上的…

04 - 慎重使用正则表达式

在讲 String 对象优化时&#xff0c;提到了 Split() 方法&#xff0c;该方法使用的正则表达式可能引起回溯问题&#xff0c;今天就来深入了解下&#xff0c;这究竟是怎么回事&#xff1f; 开始之前&#xff0c;我们先来看一个案例&#xff0c;可以帮助你更好地理解内容。 在一…

uniapp兼容微信小程序和支付宝小程序遇到的坑

1、支付宝不支持v-show 改为v-if。 2、v-html App端和H5端支持 v-html &#xff0c;微信小程序会被转为 rich-text&#xff0c;其他端不支持 v-html。 解决方法&#xff1a;去插件市场找一个支持跨端的富文本组件。 3、导航栏处有背景色延伸至导航栏外 兼容微信小程序和支…

【装饰器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式。将对象放入到一个特殊封装的对象中&#xff0c;为这个对象绑定新的行为&#xff0c;具备新的能力&#xff0c;同时又不改变其原有结构。 如果你希望在无需修改代码的情况下即可使用对象&…

《水经注地图服务》发布的卫星影像数据在OpenLayers中调用

OpenLayers是一个用于开发WebGIS客户端的JavaScript包。 OpenLayers 支持的地图来源包括Google Maps、Yahoo、 Map、微软Virtual Earth 等&#xff0c;用户还可以用简单的图片地图作为背景图&#xff0c;与其他的图层在OpenLayers 中进行叠加&#xff0c;在这一方面OpenLayers…

Linux6.15 Docker 私有仓库(harbor)

文章目录 计算机系统5G云计算第四章 LINUX Docker 私有仓库&#xff08;harbor&#xff09;一、搭建本地私有仓库二、Docker--harbor私有仓库部署与管理1.Harbor 简介1&#xff09;什么是Harbor2&#xff09;Harbor的特性3&#xff09;Harbor的构成 2.Harbor 部署1&#xff09;…

〔扩〕C# 调用Python

C# 调用Python 一、安装类库 pythonnet 谨慎使用IronPython&#xff0c;好像默认是2.7&#xff0c;运行部分外部引入的第三方包会报错 二、创建pyd 文件供c#调用 2.1 安装cython pip install cython2.2 准备自己的python文件 HtmlToMD.py import sys import html2text as ht…

电脑微信空间占用简便清理

1、打开电脑版微信、点击左下角的三根横线 2、点击左侧的“设置” 3、弹出层左侧点击“通用设置”->“存储空间管理” 4、点击清理缓存&#xff0c;或者管理 5、点击“管理”后&#xff0c;根据选择的筛选条件&#xff0c;勾线需要清理的&#xff0c;最后点击清理

TextClamp for Vue3.0(Vue3.0的文本展开收起组件)

呦&#xff01;大家好&#xff0c;好久没有更新博客了&#xff0c;最近实现了一个一直想自己完成的一个东西&#xff0c;就是文本的展开收起组件&#xff0c;以前项目需要用到&#xff0c;自己实现一个又太繁琐&#xff0c;所以那个时候都是用的别人的轮子&#xff0c;现在自己…

两种接入微信小程序智能客服对话的方式

微信小程序 此处提供两种接入微信小程序的方式。 方式一&#xff1a;扫码将机器人绑定至指定小程序&#xff0c;通过小程序内的客服组件开启智能对话功能&#xff1b; 方式二&#xff1a;通过小程序插件接入。 方式一&#xff1a;后台扫码绑定 流程示意 效果展示 使用页面…

RPA界面元素定位与操控技术详解-达观数据

RPA 入门介绍 什么是 RPA&#xff1f;RPA 是机器人流程自动化 Robotic Process Automation 的简写。在《智能RPA实战》中&#xff0c;我们这样定义&#xff1a;通过特定的、可模拟人类在计算机界面上进行操作的技术&#xff0c;按照规则自动执行相应的流程任务&#xff0c;代替…