前言

请阅读第六篇,对于理解.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 中的依赖注入)的更多相关文章

  1. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings,及.NET Core控制台项目中读取AppSettings

    问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...

  2. NET Core 中的依赖注入

    NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  3. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...

  4. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  5. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  6. .NET CORE——Console中使用依赖注入

    我们都知道,在 ASP.NET CORE 中通过依赖注入的方式来使用服务十分的简单,而在 Console 中,其实也只是稍微绕了个小弯子而已.不管是内置 DI 组件或者第三方的 DI 组件(如Auto ...

  7. Asp.net core中的依赖注入

    使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式. public Va ...

  8. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  9. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  10. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. Redis系列:RDB内存快照提供持久化能力

    ★ Redis24篇集合 1 介绍 从上一篇的 <深刻理解高性能Redis的本质> 中可以知道, 我们经常在数据库层上加一层缓存(如Redis),来保证数据的访问效率. 这样性能确实也有了 ...

  2. 内部UI自动化测试培训之python基础

    这个文档的由来是公司内部UI自动化测试培训的资料.部门为了减少测试工作量,准备做UI自动化测试.我写python,其他同事都是java,所以python基础和UI自动化测试selenium的培训就由我 ...

  3. XAF Blazor FilterPanel 布局样式

    从上一篇关于ListView布局样式的文章中,我们知道XAFBlazor是移动优先的,如果想在PC端有更好的用户体验,我们需要对布局样式进行修改.这篇介绍在之前文章中提到的FilterPanel,它的 ...

  4. vscode中输入``自动将光标后面一个单词选中,左右加入<w>和</w>标签 - snippets 的命令调用

    需求 vscode中输入``自动将光标后面一个单词选中,左右加入和标签 步骤0 准备需要安装插件 vim - 这里的点击两次按键激活的快捷键,这个插件可以设置 macros - 一次执行多个命令的插件 ...

  5. 在运行程序是出现sh: 行 1: cls: 未找到命令

    在运行程序是出现sh: 行 1: cls: 未找到命令 原因是system("cls");--这是在程序中调用系统命令,但是linux识别不了.功能是清除当前的终端显示数据.找到l ...

  6. websocket服务器的创建

    就这上篇文章的代码,我们会继续实现以下websocket的协议. 为什么要使用websocket呢? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平 ...

  7. grails中使用render方法输出XML总结

    GrailsXMLJava 1.首先看看简单的XML生成情况 Java代码  收藏代码 <images>        <image title="one" /& ...

  8. 通过socket进行网络通信(服务端)

    声明:此文只是为自己方便理解,做了一些具象的比喻和假设,并不符合客观事实,谨慎阅读! ​ 在一台主机中, 两个进程想要通信可以通过一个管道(文件):一个从管道的一端写,一个从另一端读 , 然而管道是半 ...

  9. MyBatis Java 和 Mysql数据库 数据类型对应表

    类型处理器(typeHandlers) MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Jav ...

  10. 一个简单的RTMP服务器实现 --- RTMP与H264

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...