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

简介: - 什么是依赖注入- .NET Core DI 生命周期- 服务设计- 服务范围检查

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 控制反转

004.jpg

依赖注入 与 依赖查找

依赖注入:通过编排告诉 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

目录
相关文章
|
2天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
20天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5天前
|
弹性计算 运维 Cloud Native
云原生架构的崛起与未来展望
在数字化转型的浪潮中,云原生架构凭借其高效、灵活和可扩展的特性,正逐渐成为企业IT战略的核心。本文旨在探讨云原生架构的定义、关键特性、实施优势以及面临的挑战,同时展望未来的发展趋势。通过深入分析,我们期望为读者提供一个关于云原生架构全面而深入的视角,助力企业在云计算时代做出更明智的决策。
16 3
|
17天前
|
Cloud Native 云计算 Docker
云原生技术的崛起:从容器化到微服务架构
云原生技术的崛起:从容器化到微服务架构
|
20天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
42 5
|
21天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
32 5
|
21天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
21天前
|
消息中间件 缓存 Cloud Native
云原生架构下的性能优化实践与挑战####
随着企业数字化转型的加速,云原生架构以其高度解耦、弹性伸缩和快速迭代的特性,成为现代软件开发的首选模式。本文深入探讨了云原生环境下性能优化的关键策略与面临的主要挑战,通过案例分析,揭示了如何有效利用容器化、微服务、动态调度等技术手段提升应用性能,同时指出了在复杂云环境中确保系统稳定性和高效性的难题,为开发者和架构师提供了实战指南。 ####
31 3
|
21天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用架构中的实践与思考
【10月更文挑战第38天】随着云计算的不断成熟和演进,云原生(Cloud-Native)已成为推动企业数字化转型的重要力量。本文从云原生的基本概念出发,深入探讨了其在现代应用架构中的实际应用,并结合代码示例,展示了云原生技术如何优化资源管理、提升系统弹性和加速开发流程。通过分析云原生的优势与面临的挑战,本文旨在为读者提供一份云原生转型的指南和启示。
33 3
|
21天前
|
运维 Kubernetes Cloud Native
云原生技术在现代应用架构中的实践与挑战####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在实际项目中的应用案例,分析了企业在向云原生转型过程中面临的主要挑战及应对策略。不同于传统摘要的概述性质,本摘要强调通过具体实例揭示云原生技术如何促进应用的灵活性、可扩展性和高效运维,同时指出实践中需注意的技术债务、安全合规等问题,为读者提供一幅云原生技术实践的全景视图。 ####