2.2.1 核心模块--依赖注入

  • 什么是依赖注入

  • .NET Core DI 生命周期

  • 服务设计

  • 服务范围检查

ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0

什么是依赖注入

Dependency injection 依赖注入

Inversion of Control 控制反转

依赖注入 与 依赖查找

依赖注入:通过编排告诉 IOC 容器整个内部类之间的依赖关系

依赖查找:通过回调或者上下文获取依赖

asp .net core 如何实现

在上一小节新建的 HelloApi 项目中修改 Program.cs

namespace HelloApi
{public class Program{public static void Main(string[] args){var host = CreateHostBuilder(args).Build();Console.WriteLine("Server started");// 依赖查找var helloService = host.Services.GetRequiredService<IHelloService>();helloService.Hello();host.Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureServices((ctx,services)=>{// 依赖注入// 任何时候获取到的都是一个新的实例services.AddTransient<IHelloService, HelloService>();}).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
}

IHelloService

namespace HelloApi.Services
{public interface IHelloService{void Hello();}
}

HelloService

namespace HelloApi.Services
{public class HelloService : IHelloService{public void Hello(){Console.WriteLine("hello dotnet core");}}
}

.NET Core DI 生命周期

// 依赖注入
// 任何时候获取到的都是一个新的实例
services.AddTransient<IHelloService, HelloService>();
// 每个 scope 都有一个实例
services.AddScoped<IHelloService, HelloService>();
// 单例,整个应用程序的生命周期只有一个实例
services.AddSingleton<IHelloService, HelloService>();

通过 id 区分不同的服务生命周期

HelloService

private string _id;public HelloService()
{_id = Guid.NewGuid().ToString();
}

Program.cs

// 依赖查找
var helloService1 = host.Services.GetRequiredService<IHelloService>();
helloService1.Hello();var helloService2 = host.Services.GetRequiredService<IHelloService>();
helloService2.Hello();

启动程序,输出如下:

Server started
hello dotnet core: cc77ee85-3806-4c29-b693-8da8bcf40498
hello dotnet core: 3306bebc-2340-4645-82e7-0e15fac0e9c7

AddSingleton

Program.cs

.ConfigureServices((ctx,services)=>
{// 依赖注入// 单例,整个应用程序的生命周期只有一个实例services.AddSingleton<IHelloService, HelloService>();
})

启动程序,输出如下:

Server started
hello dotnet core: 35aa7646-e2bd-4d44-8f15-cd6aca3b0215
hello dotnet core: 35aa7646-e2bd-4d44-8f15-cd6aca3b0215

AddScoped

需要自定义一个 scope

Program.cs

using (var scope = host.Services.CreateScope())
{// 依赖查找var helloService1 = scope.ServiceProvider.GetRequiredService<IHelloService>();helloService1.Hello();var helloService2 = scope.ServiceProvider.GetRequiredService<IHelloService>();helloService2.Hello();
}
.ConfigureServices((ctx,services)=>
{// 依赖注入// 每个 scope 都有一个实例services.AddScoped<IHelloService, HelloService>();
})

启动程序,输出如下:

Server started
hello dotnet core: abf083e2-7914-43b9-8e7f-540381a05b37
hello dotnet core: abf083e2-7914-43b9-8e7f-540381a05b37

服务设计

  • 不要使用静态类和静态成员,不要使用全局状态,而改为使用全局单例类

  • 不要在内部自己实例化对象

  • 每一个服务应该尽可能地小、易创建、易测试

服务范围检查

singleton 的服务不能依赖于 scoped 的服务

GitHub源码链接:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi

课程链接

.NET云原生架构师训练营讲什么,怎么讲,讲多久

欢迎各位读者加入微信群一起学习交流,

在公众号后台回复“加群”即可~~

.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记相关推荐

  1. .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

    2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

    2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  6. .NET 云原生架构师训练营(系统架构)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  7. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  8. ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

最新文章

  1. python中的网页解析器_python爬虫初探(三):HTML解析器
  2. python中matrix是什么意思_初识Python
  3. mdf与ldf文件如何还原到SQLserver数据库
  4. sap开发-采购订单更改历史table
  5. rabbitmq+redis在优化秒杀商品接口中的使用实例
  6. 在Grails战争中添加“精简” Groovy Web控制台
  7. 微信小程序中form 表单提交和取值实例详解
  8. 关于COM的Reg-Free(免注册)技术简介及实例讲解。
  9. 就这么简单!构建强大的WebShell防护体系
  10. AD09之与AD6版本使用不同对比
  11. r语言转python,R语言与python语言读写loom文件
  12. 服务器外链图片不显示,nginx服务器设置图片防盗链,禁止图片外链
  13. 第十周、第十一周学习总结
  14. 计算机考研数学考一还是二,考研我不知道自己考数一还是数学二
  15. 自学软件测试3个月,原来15K也就这么回事...
  16. 英语语法 - 可可英语
  17. 【CSS】 画优惠券锯齿边框样式
  18. vga转html电脑打不开,VGA切换器使用方法和常见问题说明
  19. 云数据库ClickHouse资源隔离 - 弹性资源队列
  20. Cesium中自定义材质material

热门文章

  1. SQL 查询数据库中包含指定字符串的相关表和相关记录
  2. PHP常用工具方法集...
  3. centOS7 安装mysql 设置远程访问
  4. Solr6.1.0Windows安装步骤
  5. Redis数据类型应用场景及具体方法总结
  6. objective-c中的static
  7. 一个女孩子对老公/男朋友的要求
  8. 鸿蒙系统发布会是什么时候,鸿蒙系统2.0发布时间是什么时候?或将与EMUI11一同发布!...
  9. plex实现流媒体服务器_如何从Plex Media Server离线查看下载和同步媒体
  10. React 深入学习:React 更新队列