c# 依赖注入-服务的生命周期

在 C# 中,依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态(transient)、作用域(scoped)和单例(singleton)三种。

  1. 瞬态(Transient)生命周期
    瞬态生命周期是指每次从容器中请求服务时,都会创建一个新的实例。这意味着每次注入服务时都会得到一个新的对象,对象的生命周期仅在请求期间。适用于每次都需要新实例的场景。
  • 应用场景:适用于需要频繁创建新实例的服务。每次请求时都会创建一个新的-对象,对象的生命周期仅限于当前请求或方法调用。
  • 示例:适合轻量级临时对象或者对象内部状态随请求变化的情况。例如,一些计算服务或者临时数据处理服务。
services.AddTransient<IService, Service>();
  1. 作用域(Scoped)生命周期:
    作用域生命周期是指在同一个作用域中,每次请求服务都会得到相同的实例,而不同作用域之间会有不同的实例。通常在每个 HTTP 请求或每个线程上下文中会创建一个新的作用域,服务的生命周期为整个作用域。适用于需要在同一个作用域内共享服务实例的场景。
  • 应用场景:适用于需要在同一个作用域内共享实例的服务。通常在 Web 应用中,每个 HTTP 请求会创建一个作用域,该作用域内的服务实例在整个请求过程中都是同一个。
  • 示例:在处理每个 HTTP 请求时,例如数据库上下文或者用户身份验证服务,保证在同一请求中使用相同的实例以确保数据一致性和请求隔离。
services.AddScoped<IService, Service>();
  1. 单例(Singleton)生命周期
    单例生命周期是指在整个应用程序生命周期中只会创建一个实例,所有请求都会共享同一个实例。适用于整个应用程序生命周期内只需要一个实例的场景。
  • 应用场景:适用于整个应用程序生命周期内只需要一个实例的服务。这样可以确保所有请求共享同一个实例,节省资源并确保全局状态一致性。
  • 示例:例如配置管理服务、日志服务或者缓存服务,这些服务在应用程序运行期间始终保持不变,并且需要在应用程序的各个部分共享相同的实例。
services.AddSingleton<IService, Service>();

使用示例

using Microsoft.Extensions.DependencyInjection;
using System;

namespace IOCTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //SingletionServiceTest();

            //TransientServiceTest();

            ScoreServiceTest();

            Console.ReadKey();
            
        }

        private static void ScoreServiceTest()
        {
            ServiceCollection services = new ServiceCollection();
            services.AddScoped<TestServicelmpl>();
            TestServicelmpl tt;
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                using (IServiceScope scope1 = sp.CreateScope())
                {
                    TestServicelmpl testServicelmpl = scope1.ServiceProvider.GetService<TestServicelmpl>();
                    TestServicelmpl testServicelmpl2 = scope1.ServiceProvider.GetService<TestServicelmpl>();
                    testServicelmpl.Name = "ouou";
                    bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);
                    tt = testServicelmpl;
                }

                using (IServiceScope scope2 = sp.CreateScope())
                {
                    TestServicelmpl testServicelmpl = scope2.ServiceProvider.GetService<TestServicelmpl>();
                    TestServicelmpl testServicelmpl2 = scope2.ServiceProvider.GetService<TestServicelmpl>();
                    testServicelmpl.Name = "kk";

                    bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);

                    isEqual = ReferenceEquals(testServicelmpl, tt);
                }
            }
        }

        static void SingletionServiceTest()
        {
            ServiceCollection services = new ServiceCollection();
            services.AddSingleton<TestServicelmpl>();
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                TestServicelmpl testServicelmpl = sp.GetService<TestServicelmpl>();
                TestServicelmpl testServicelmpl2 = sp.GetService<TestServicelmpl>();

                bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);

                testServicelmpl.Name = "ouou";
                testServicelmpl.SayHi();

                testServicelmpl.Name = "kk";
                testServicelmpl2.SayHi();
            }
        }

        static void TransientServiceTest()
        {
            ServiceCollection services = new ServiceCollection();
            services.AddTransient<TestServicelmpl>();

            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                TestServicelmpl testServicelmpl = sp.GetService<TestServicelmpl>();
                TestServicelmpl testServicelmpl2 = sp.GetService<TestServicelmpl>();

                bool isEqual = ReferenceEquals(testServicelmpl, testServicelmpl2);

                testServicelmpl.Name = "ouou";
                testServicelmpl.SayHi();

                testServicelmpl.Name = "kk";
                testServicelmpl2.SayHi();
            }
        }
    }


}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ou.cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值