首页 > 其他分享 >dotnet_服务声明周期_transient_scoped_singlton

dotnet_服务声明周期_transient_scoped_singlton

时间:2024-03-07 23:23:18浏览次数:23  
标签:TransientScopedSingleton singlton System transient scoped cs using public GetOpe

ASP.NET 中的 Transient、Scoped 和 Singleton区别

该代码展示了 ASP.NET Core 中服务生命周期管理的不同选项,特别关注 Transient、Scoped 和 Singleton 服务。

说明

Transient:

  • 每次请求都会创建一个新的 OperationService 实例,并生成一个新的 GUID。
  • 因此,同一个请求中的不同控制器或服务调用将获得不同的 ID。

Scoped:

  • 同一个 HTTP 请求中所有对 OperationService 的引用都会返回相同的实例。
  • 因此,同一个请求中的所有控制器或服务调用将获得相同的 ID。

Singleton:

  • 应用程序生命周期内所有对 OperationService 的引用都会返回相同的实例。
  • 因此,应用程序运行期间所有对 GetOperationID 的调用都会返回相同的 ID。

1. Startup.cs:

  • 该文件通过注册服务和定义中间件管道来配置应用程序。

  • ConfigureServices 方法中,注册了三个服务:

    • ITransientService: 使用 AddTransient 注册为瞬态。每次请求都会创建一个新实例。

    • IScopedService: 使用 AddScoped 注册为范围。同一 HTTP 请求中会共享一个实例,但每个新请求都会创建一个新实例。

    • ISingletonService: 使用 AddSingleton 注册为单例。应用程序生命周期内会共享一个实例。

    • 这三个服务都由 OperationService 类实现。

2. Program.cs:

  • 这是应用程序的入口点。
  • 它创建一个 Web 主机并配置它使用 Startup 类。

3. HomeController.cs:

  • 该类定义了处理传入 HTTP 请求的 HomeController
  • 构造函数注入所有六个服务实例:Transient、Scoped 和 Singleton 各两个。
  • Index 方法使用 GetOperationID 方法检索并显示每个注入服务的操作 ID。

4. OperationService.cs:

  • 该类实现了所有三个服务接口:ITransientServiceIScopedServiceISingletonService
  • 它定义了一个单一构造函数,该构造函数在创建对象时生成唯一标识符 (Guid)。
  • GetOperationID 方法只是返回生成的 ID。

5. 接口文件 (ITransientService.cs, IScopedService.cs, ISingletonService.cs):

  • 这些文件定义每个服务类型的接口,仅包含 GetOperationID 方法声明。

总体而言,此代码演示了:

  • 如何在 ASP.NET Core 中注册具有不同生命周期的服务。
  • 如何在控制器中注入和使用这些服务。
  • Transient、Scoped 和 Singleton 服务之间的行为差异。

代码示例

TransientScopedSingleton-master/Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TransientScopedSingleton
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<ITransientService, OperationService>();
            services.AddScoped<IScopedService, OperationService>();
            services.AddSingleton<ISingletonService, OperationService>();
           
            services.AddControllersWithViews();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

TransientScopedSingleton-master/Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TransientScopedSingleton
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

TransientScopedSingleton-master/Controllers/HomeController.cs

using Microsoft.AspNetCore.Mvc;

namespace TransientScopedSingleton.Controllers
{
    public class HomeController : Controller
    {
        private readonly ITransientService _transientService1;
        private readonly ITransientService _transientService2;
        private readonly IScopedService _scopedService1;
        private readonly IScopedService _scopedService2;
        private readonly ISingletonService _singletonService1;
        private readonly ISingletonService _singletonService2;
        public HomeController(
            ITransientService transientService1,
            ITransientService transientService2,
            IScopedService scopedService1,
            IScopedService scopedService2,
            ISingletonService singletonService1,
            ISingletonService singletonService2)
        {
            _transientService1 = transientService1;
            _transientService2 = transientService2;

            _scopedService1 = scopedService1;
            _scopedService2 = scopedService2;

            _singletonService1 = singletonService1;
            _singletonService2 = singletonService2;

        }

        public IActionResult Index()
        {
            ViewBag.transient1 = _transientService1.GetOperationID().ToString();
            ViewBag.transient2 = _transientService2.GetOperationID().ToString();

            ViewBag.scoped1 = _scopedService1.GetOperationID().ToString();
            ViewBag.scoped2 = _scopedService2.GetOperationID().ToString();

            ViewBag.singleton1 = _singletonService1.GetOperationID().ToString();
            ViewBag.singleton2 = _singletonService2.GetOperationID().ToString();
            return View();
        }
    }
}

TransientScopedSingleton-master/Services/OperationService.cs

using System;

namespace TransientScopedSingleton
{
    public class OperationService : ITransientService, IScopedService, ISingletonService
    {
        Guid id;
        public OperationService()
        {
            id = Guid.NewGuid();
        }
        public Guid GetOperationID()
        {
            return id;
        }
    }
}

TransientScopedSingleton-master/Services/ITransientService.cs

using System;

namespace TransientScopedSingleton
{
    public interface ITransientService
    {
        Guid GetOperationID();
    }
}

TransientScopedSingleton-master/Services/IScopedService.cs

using System;

namespace TransientScopedSingleton
{
    public interface IScopedService
    {
        Guid GetOperationID();
    }
}

TransientScopedSingleton-master/Services/ISingletonService.cs

using System;

namespace TransientScopedSingleton
{
    public interface ISingletonService
    {
        Guid GetOperationID();
    }
}

标签:TransientScopedSingleton,singlton,System,transient,scoped,cs,using,public,GetOpe
From: https://www.cnblogs.com/zhuoss/p/18060014

相关文章

  • 漫谈.net core和Autofac中的Scoped生命周期
      我们知道,.netcore内置了IOC容器,通常,一个服务的生命周期有三种:Transient、Scoped、Singleton  Transient:临时性的服务,当进行服务注入时,每次都是重新创建一个新的对象实例Scoped:范围性的服务,当在一个范围内进行服务注入时,保证使用同一个实例对象(可以理解为一个ISer......
  • Go 100 mistakes - #79: Not closing transient resources
        ......
  • vue的scoped中的class data-v-xxx生成规则为什么是按照文件的路径?
    Vue.js中,当在单文件组件(.vue文件)的<style>标签上使用scoped属性时,VueLoader会为组件中的CSS添加一个唯一的属性选择器,以确保样式只作用于当前组件内的元素。这个独特的属性通常格式为data-v-xxx,其中xxx是一个根据文件内容和路径生成的哈希值。生成规则基于文件内容和......
  • [Typescript] Resolving the Block-scoped Variable Error in TypeScript (moduleDete
    constNAME="Matt";TypeScriptistellinguswecan'tredeclarethe name variablebecauseithasalreadybeendeclaredinsideof lib.dom.d.ts.The index.ts fileisbeingdetectedasaglobalscriptratherthanamodule.Thisisbecause,by......
  • 依赖注入容器 perRequest(Transient)和Singleton区别
    在CM框架中,"perRequest"和"Singleton"都是生命周期配置选项,用于指示对象的创建和共享方式。它们之间的区别在于对象实例的生命周期和共享方式。对于"perRequest"(有时被称为"Transient"):对象的实例在每个请求处理期间只创建一次,并在同一个请求内共享。每个请求都有自己的对象实例,不......
  • SQLAlchemy scoped_session
    SQLAlchemyscoped_session本身session不是线程安全的。 https://docs.sqlalchemy.org/en/14/orm/contextual.htmlTheobjectisthescoped_sessionobject,anditrepresentsaregistryofSessionobjects.Ifyou’renotfamiliarwiththeregistrypattern,ago......
  • vue3中的样式为什么加上scoped不生效
    <style>标签添加scoped属性时,Vue会自动为该组件内的所有元素添加一个独特的数据属性,例如data-v-f3f3eg9。同时,它也会修改你的CSS选择器,使得它们只匹配带有这个独特数据属性的元素。这样做的目的是为了确保样式只应用于当前组件内的元素,避免影响到其他组件。然而,当你尝试覆盖子组......
  • style中通过import引入样式时,scoped不生效
    通过import引入的外部css文件,这种引入方式是全局的,也会影响其他组件的页面样式<stylelang="scss"scoped>@importurl(../style.scss);</style>此时虽然用了scoped,但是样式还是全局的。造成样式污染的案例:(1)、父页面中引入css文件<stylescoped>@import"~@/assets/sty......
  • java 序列话注解 @Transient
    java序列话注解@TransientJava序列化注解及其使用简介在Java程序中,对象的序列化是指将对象转换为字节流的过程,以便在网络上传输或保存到文件中。而反序列化则是将字节流重新转换为对象。Java提供了java.io.Serializable接口,用于标识可序列化的类。然而,有时我们希望......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......