.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记
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-0e15fac0e9c7AddSingleton
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-cd6aca3b0215AddScoped
需要自定義一個 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 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程去除背景绿幕抠图,基于.NET+Op
- 下一篇: 如何在 ASP.NET Core 中使用