重新整理.net core 计1400篇[七] (.net core 中的依赖注入)
前言
请阅读第六篇,对于理解.net core 中的依赖注入很关键。
和我们上一篇不同的是,.net core服务注入保存在IServiceCollection 中,而将集合创建的依赖注入容器体现为IServerProvider。
具体如何正文中体现。
正文
下面是创建的一些实例:
public interface IFoo { };
public interface IBar { };
public interface IBaz { };
public interface IFoobar<T1, T2> { };
public class Base : IDisposable
{
public Base(){
Console.WriteLine($"An instance of {GetType().Name} is created");
}
public void Dispose()
{
Console.WriteLine($"the instance of {GetType().Name} is disposed");
}
}
public class Foo : Base, IFoo, IDisposable { };
public class Bar : Base, IBar, IDisposable { };
public class Baz : Base, IBaz, IDisposable { };
public class FooBar<T1, T2> : IFoobar<T1, T2>
{
public IFoo Foo { get; }
public IBar Bar { get; }
public FooBar(IFoo foo, IBar bar)
{
Foo = foo;
Bar = bar;
}
}
在.net core 中,依赖注入有3三种注入方式,也称作3种生命周期,分别是:transient,scoped,singleton
transient是瞬息的,是什么意思呢?
是每次创建容器不是同一个,而是new了一个。
scoped 是领域的,在同一领域内,也就是同一个IServerProvider中只存在一个相同的容器。
singleton 这个就是单例了,无论是在任何一个领域内,获取的都是同一个。
上面的这几种,分别对应了该系列六中的:transient,self,root。
下面就来用例子展示一下:
先测试AddScoped:
var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
var bar=provider.GetService<IBar>();
var bar1 = provider.GetService<IBar>();
if (bar.Equals(bar1))
{
//打印相同
Console.WriteLine("相同");
}
上面中将会打印相同,也就是说,其实同一个对象。
var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
var provider1 = provider.CreateScope().ServiceProvider;
var bar=provider.GetService<IBar>();
var bar1 = provider1 .GetService<IBar>();
if (bar.Equals(bar1))
{
Console.WriteLine("相同");
}else{
//打印不同
Console.WriteLine("不同");
}
在不是同一个provider 中是不同的。
测试:AddTransient
var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
var foo=provider.GetService<IFoo>();
var foo1= provider.GetService<IFoo>();
if (foo.Equals(foo1))
{
Console.WriteLine("相同");
}else{
//打印不同
Console.WriteLine("不同");
}
说明每次都不同。
测试singleton:
var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
var provider1 = provider.CreateScope().ServiceProvider();
var Baz=provider.GetService<IBaz>();
var Baz1 = provider1 .GetService<IBaz>();
if (Baz.Equals(Baz1))
{
//打印相同
Console.WriteLine("相同");
}else{
Console.WriteLine("不同");
}
在不同的provider 中获取对象相同。
总结
.net core 中的原理在六中已经体现了出来,该章只是简单描述用法,下一章为稍稍深入篇。
重新整理.net core 计1400篇[七] (.net core 中的依赖注入)的更多相关文章
- ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings,及.NET Core控制台项目中读取AppSettings
问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...
- NET Core 中的依赖注入
NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...
- 在.NET Core控制台程序中使用依赖注入
之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...
- .NET CORE——Console中使用依赖注入
我们都知道,在 ASP.NET CORE 中通过依赖注入的方式来使用服务十分的简单,而在 Console 中,其实也只是稍微绕了个小弯子而已.不管是内置 DI 组件或者第三方的 DI 组件(如Auto ...
- Asp.net core中的依赖注入
使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式. public Va ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
随机推荐
- TCP 中的 Delay ACK 和 Nagle 算法
哈喽大家好,我是咸鱼. 今天分享一篇大佬的文章,作者:卡瓦邦噶! 文章链接:https://www.kawabangga.com/posts/5845 教科书介绍的 TCP 内容通常比较基础:包括三次 ...
- OpenCV开发笔记(七十六):相机标定(一):识别棋盘并绘制角点
前言 知道图像畸变矫映射的原理之后,那么如何得到相机的内参是矫正的第一步,内参决定了内参矩阵(中心点.焦距等),用内参矩阵才能计算出投影矩阵,从而将原本畸变的图像矫正为平面投影图像. 本篇描述了 ...
- Jpackage-制作无需预装Java环境的Jar可执行程序
JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...
- 词根 ten 展开 持有 /tin/tent/tain “to hold”
词根 ten 展开 持有 /tin/tent/tain "to hold" 记忆方式:en是拿出.忘了从哪里看的了.t是动作过去. 如果是 过去的时候已经拿出来,那就是 展开 延展 ...
- Redis 八种常用数据类型详解
夯实基础,这篇文章带着大家回顾一下 Redis 中的 8 种常用数据类型: 5 种基础数据类型:String(字符串).List(列表).Set(集合).Hash(散列).Zset(有序集合). 3 ...
- 泰凌微2.4G无线私有协议芯片开发总结
案例 近些年,团队一直围绕着无线这块来做产品方案.一个无意的举动,接触到了泰凌微的2.4G私有协议芯片,发现这颗芯片在好几个场景中使用非常合适.就把这个芯片推荐给了客户,经过几个案子的历练.积 ...
- Kotlin学习快速入门(12)—— 位运算符
由于不懂pythod,最近拜托朋友研究下解密live2d模型的解密算法,朋友写出了Java的代码 之后我进行改版,在转为kotlin的时候,发现kotlin自动转换有些坑,以及kotlin中的位运算符 ...
- display标签简介
下面是网友总结的display标签的优缺点: 1. 分页 如果想对代码分页,只需在display:table标签中添加一项pagesize="每页显示行数" 2. 对列排序 dis ...
- 【VMware vSAN】全新vSAN 8 ESA快速存储架构配置文件服务并创建文件共享。
早在2020年,VMware就发布了vSphere7.vSAN7.VCF4等等产品的更新,当时随着云原生的火热,基于容器技术的现代应用程序快速发展,Docker.Kubernetes这些容器平台被广泛 ...
- 24_用Qt和FFmpeg实现简单的YUV播放器
前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QImage很容易的实现一个简单的YUV播放器了. 播放器功能很简单,只有播放.暂停和停止 ...