NetCore 依赖注入之服务之间的依赖关系

简单介绍,直接官方文档

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

public interface IOperation
{Guid OperationId { get; }
}public interface IOperationTransient : IOperation
{
}public interface IOperationScoped : IOperation
{
}public interface IOperationSingleton : IOperation
{
}public interface IOperationSingletonInstance : IOperation
{
}
public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
{public Operation() : this(Guid.NewGuid()){}public Operation(Guid id){OperationId = id;}public Guid OperationId { get; private set; }
}
public class OperationService
{public OperationService(IOperationTransient transientOperation,IOperationScoped scopedOperation,IOperationSingleton singletonOperation,IOperationSingletonInstance instanceOperation){TransientOperation = transientOperation;ScopedOperation = scopedOperation;SingletonOperation = singletonOperation;SingletonInstanceOperation = instanceOperation;}public IOperationTransient TransientOperation { get; }public IOperationScoped ScopedOperation { get; }public IOperationSingleton SingletonOperation { get; }public IOperationSingletonInstance SingletonInstanceOperation { get; }
}
在 Startup.ConfigureServices 中,根据其指定的生存期,将每个类型添加到容器中:
C#public void ConfigureServices(IServiceCollection services)
{services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.AddScoped<IMyDependency, MyDependency>();services.AddTransient<IOperationTransient, Operation>();services.AddScoped<IOperationScoped, Operation>();services.AddSingleton<IOperationSingleton, Operation>();services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));// OperationService depends on each of the other Operation types.services.AddTransient<OperationService, OperationService>();
}
public class IndexModel : PageModel
{private readonly IMyDependency _myDependency;public IndexModel(IMyDependency myDependency, OperationService operationService,IOperationTransient transientOperation,IOperationScoped scopedOperation,IOperationSingleton singletonOperation,IOperationSingletonInstance singletonInstanceOperation){_myDependency = myDependency;OperationService = operationService;TransientOperation = transientOperation;ScopedOperation = scopedOperation;SingletonOperation = singletonOperation;SingletonInstanceOperation = singletonInstanceOperation;}public OperationService OperationService { get; }public IOperationTransient TransientOperation { get; }public IOperationScoped ScopedOperation { get; }public IOperationSingleton SingletonOperation { get; }public IOperationSingletonInstance SingletonInstanceOperation { get; }public async Task OnGetAsync(){await _myDependency.WriteMessage("IndexModel.OnGetAsync created this message.");}
}

以下两个输出显示了两个请求的结果:

第一个请求:

控制器操作:

暂时性:d233e165-f417-469b-a866-1cf1935d2518
作用域:5d997e2d-55f5-4a64-8388-51c4e3a1ad19
单一实例:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

OperationService 操作:

暂时性:c6b049eb-1318-4e31-90f1-eb2dd849ff64
作用域:5d997e2d-55f5-4a64-8388-51c4e3a1ad19
单一实例:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

第二个请求:

控制器操作:

暂时性:b63bd538-0a37-4ff1-90ba-081c5138dda0
作用域:31e820c5-4834-4d22-83fc-a60118acb9f4
单一实例:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

OperationService 操作:

暂时性:c4cbacb8-36a2-436d-81c8-8c1b78808aaf
作用域:31e820c5-4834-4d22-83fc-a60118acb9f4
单一实例:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

观察哪个 OperationId 值会在一个请求之内和不同请求之间变化:

    • 暂时性 对象始终不同。 第一个和第二个客户端请求的暂时性 OperationId 值对于 OperationService 操作和在客户端请求内都是不同的。 为每个服务请求和客户端请求提供了一个新实例。
    • 作用域 对象在一个客户端请求中是相同的,但在多个客户端请求中是不同的。
    • 单一实例 对象对每个对象和每个请求都是相同的(不管 Startup.ConfigureServices 中是否提供 Operation 实例)。

接下来是本文重点要说明的

 

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<SingletonService>();services.AddTransient<TransientService>();services.AddScoped<ScopedService>();
}

 

public class SingletonService{public string Id = Guid.NewGuid().ToString();}public class ScopedService{public string Id = Guid.NewGuid().ToString();}public class TransientService{public string Id = Guid.NewGuid().ToString();private ScopedService _transient;private SingletonService _singleton;public TransientService(ScopedService transient, SingletonService singleton){_transient = transient;_singleton = singleton;}}

这种情况是可以的,transient 可以依赖 singleton 和 scoped

对于 Transient 服务,它可以被任何服务依赖,但是在依赖的服务中创建的服务的生命周期会跟随依赖的服务
对于 Scoped 服务,它只能被 Transient 和 Scoped 服务依赖,生命周期不会变化,如果要在 Singleton 服务中使用,可以使用 IServiceProvider 的 CreateScope 方法 ,然后 GetService, 但是 生成的 scoped 服务生命周期为
Singleton

对于 Singleton 服务,
它可以被任何服务依赖,生命周期不会变化
 
public class SingletonService{public string Id = Guid.NewGuid().ToString();private ScopedService _scoped;public SingletonService(IServiceProvider serviceProvider){using (var scope = serviceProvider.CreateScope()){_scoped = scope.ServiceProvider.GetService<ScopedService>();}}}public class ScopedService{public string Id = Guid.NewGuid().ToString();}public class TransientService{public string Id = Guid.NewGuid().ToString();}

 

这个 在单例中使用 Scoped 服务

转载于:https://www.cnblogs.com/microestc/p/11215094.html

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

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

相关文章

安卓注册手机短信验证码验证的案例-01

为了实现注册手机验证验证码 在网上百度了许久的注册手机验证码发送验证的案例要么是太过时要么就是不能用了 在此把我最近几天研究的成果发到这里希望 能够给遇到相同问题的人给予帮助 首先看看运行的效果图&#xff1a; 简单的介绍下博主用的是mod 的sdk来短信验证 使用的…

项目管理理论与实践系列文章索引

项目管理理论与实践&#xff08;1&#xff09;——企业项目管理介绍 项目管理理论与实践&#xff08;2&#xff09;——软件需求分析 项目管理理论与实践&#xff08;3&#xff09;——如何进行有效的项目管理 项目管理理论与实践&#xff08;4&#xff09;——UML应用&#xf…

Gym - 100543L

Gym - 100543Lhttps://vjudge.net/problem/153854/origin区间dp&#xff0c;要从区间长度为1开始dp #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #in…

安卓注册手机短信验证码验证的案例-02

本部分我们将讲述如何实现手机注册验证码的代码 首先我们得有一个验证码的界面如下图所示&#xff1a; 代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/an…

[html] input上传图片怎样触发默认拍照功能?

[html] input上传图片怎样触发默认拍照功能&#xff1f; 使用 capture 属性&#xff0c;capture 的值可以是&#xff1a;camera 打开摄像头user 打开前置摄像头environment 打开后置摄像头以上几个属性都不能保证设备会按照设置的一样打开前置或后置摄像头&#xff0c;如果设备…

推荐阅读《大话设计模式》的策划编辑陈禹成写的新书《电脑使用说明书》

三年前&#xff0c;我很幸运能与陈禹成&#xff08;当年叫陈冰&#xff0c;曾是清华大学出版社策划编辑&#xff09;合作&#xff0c;完成了《大话设计模式》的创作和出版工作。应该说&#xff0c;没有陈禹成的帮助&#xff0c;也不可能有《大话设计模式》的成功。非常感谢他&a…

python复利计算_使用Python函数计算复利

写一个函数&#xff0c;在给定的年数后&#xff0c;用给定的初始余额和利率计算银行帐户的余额。假设利息每年复利。在 出现错误“ValueError:索引28处不支持格式字符I&#xff08;0x49&#xff09;” 这是我目前为止的代码。在def BankBalance(): InputB 1000 return InputB …

c# asp.net mvc 开发的正方教务助手(一)

在网上百度了很多模拟登陆教务教务助手的教程 要么是java要么是php要么就是python 难得查找到一个c#的结果又是客户端的&#xff0c;一个网页版的都没看到 于是楼主决定在研究&#xff0c;自行写一个网页版方正教务助手 历时一个星期终于完成&#xff0c;效果如下所示&…

[html] input上传文件可以同时选择多张吗?怎么设置?

[html] input上传文件可以同时选择多张吗&#xff1f;怎么设置&#xff1f; <input type"file" multiple"multiple" value"浏览" />个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷…

C# 解析 Targa文件 (TGA) 图形

使用方法 ImageTGA _Tga new ImageTGA(); Bitmap _Bitmap new Bitmap(124, 234); this.DrawToBitmap(_Bitmap, new Rectangle(0, 0, 124, 234)); _Tga.Image _Bitmap; _Tga.SaveImage("C:\1.tga"); 保存的时候只实现了非RLE的 8位 24位 32位 有需要的自己改写下 S…

python中读写excel_python读写Excel

Python读写excel 对于python 处理excel 表格&#xff0c;这个日常工作的需求还是不少&#xff0c;于是查查资料&#xff0c;自己写写&#xff0c;总结一下&#xff0c;记录一下&#xff0c;下次遇到直接拿过来用&#xff0c;方便自己&#xff0c;方便大家。 好在python有读写ex…

c# asp.net mvc 开发的正方教务助手(二)

在上一篇文章展示了项目实际运行情况 现在我们来分析该项目如何完成的&#xff1a; 第一步&#xff1a;登陆你们的教务&#xff0c;这是我们学习的教务的主页http://jw.svtcc.edu.cn/Default2.aspx&#xff0c;进去之后&#xff0c;打开使用火狐浏览器进行登陆分析 在火狐浏览…

[html] 如何禁止input输入的历史记录?

[html] 如何禁止input输入的历史记录&#xff1f; 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

单独安装想要的office_安装OFFICE不再求人,最省心的方法

强烈建议选择office部署工具Office Tool Plus 不建议选择微软官方的office 2016部署工具 因为还需要手动更改代码&#xff0c;不利于新手安装。office tool plus它能够帮助用户轻松的在线下载安装 Office 的各个版本&#xff0c;安装过程中用户可以自由选择安装哪些需要使用的组…

{php mysql}

###1.连接数据库服务器函数&#xff08;2个&#xff09;&#xff1a; mysql_connect,mysql_pconnect (1).mysql_connect() 格式&#xff1a;int mysql_connect(string [hostname] [:port],string [username],string [password]); hostname // * 服务器名username // * 服务器…

C# MVC的博客开发(一)登录

由于前端使用的是layui的模板&#xff0c;该模板自带登录和注册页面&#xff0c;但是此页面的登录和普通页面的登录有些不同登录后返回的数据也需要处理&#xff0c;这里我来整理下layui登录时候遇到的问题首先登录提交数据的js我们在login.html并没有找到&#xff0c;form提交…

案例八:shell自动化管理账本脚本

该脚本目的帮助管理员创建账号、删除账号、锁定账号、解锁账号。 #!/bin/bash #filename: #author: #date:2018-6-6 echo "用户管理程序" echo "1.创建用户" echo "2.删除用户" echo "3.锁定用户" echo "4.解锁用户" echo &…

小甲鱼python课后题007_[Python]小甲鱼Python视频第007-008课(了不起的分支和循环)课后题及参考解答...

# -*- coding: utf-8 -*- """ Created on Mon Mar 4 23:35:19 2019 author: fengs """ """ 测试题: 0. if not (money < 100): 上边这行代码相当于&#xff1f; if money > 100: 1. assert 的作用是什么&#xff1f; 断言功…

C# MVC的博客开发(二)登录

解决了登录数据在哪里提交的问题我们进行后台的登录的编写和实现后台登录代码我就不详细讲解了就是把传输过去的数据和数据库进行匹配如果存在就返回一个值如果不存在就另外一个值但是登录的时候我们可能遇到用户输入的用户密码不对或者其他的错误&#xff0c;官网的首页输入密…

程序员买房--续

上海是高房价的代表&#xff0c;其高耸云霄的房价的确不足以客观代表普遍水平。那么我们以内地稍稍低调的二线城市郑州为例&#xff0c;探讨工薪阶层是否能够征服房价&#xff0c;幸福快乐的生活。 郑州市2011年房均价位6000 &#xff0c;或许很多人会惊呼&#xff0c;这么便宜…