" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core服務(wù)生命周期

 更新時(shí)間:2022年04月06日 11:42:49   作者:暗斷腸  
這篇文章介紹了ASP.NET Core中的服務(wù)生命周期,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.前言

在ConfigureServices方法中的容器注冊(cè)每個(gè)應(yīng)用程序的服務(wù),Asp.Core都可以為每個(gè)應(yīng)用程序提供三種服務(wù)生命周期:

  • Transient(暫時(shí)):每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的實(shí)例。這種生命周期最適合輕量級(jí),無狀態(tài)服務(wù)。
  • Scoped(作用域):在同一個(gè)作用域內(nèi)只初始化一個(gè)實(shí)例 ,可以理解為每一個(gè)請(qǐng)求只創(chuàng)建一個(gè)實(shí)例,同一個(gè)請(qǐng)求會(huì)在一個(gè)作用域內(nèi)。
  • Singleton(單例):整個(gè)應(yīng)用程序生命周期以內(nèi)只創(chuàng)建一個(gè)實(shí)例,后續(xù)每個(gè)請(qǐng)求都使用相同的實(shí)例。如果應(yīng)用程序需要單例行為,建議讓服務(wù)容器管理服務(wù)的生命周期,而不是在自己的類中實(shí)現(xiàn)單例模式。

2.服務(wù)生命周期與注冊(cè)選項(xiàng)案例演示

為了演示生命周期和注冊(cè)選項(xiàng)之間的差異,請(qǐng)考慮以下接口,將任務(wù)表示為具有唯一標(biāo)識(shí)符 OperationId 的操作。根據(jù)以下接口配置操作服務(wù)的生命周期的方式,容器在類請(qǐng)求時(shí)提供相同或不同的服務(wù)實(shí)例:

public interface IOperation
{
    Guid OperationId { get; }
}
public interface IOperationTransient : IOperation
{
}
public interface IOperationScoped : IOperation
{
}
public interface IOperationSingleton : IOperation
{
}
public interface IOperationSingletonInstance : IOperation
{
}

上面四種服務(wù)接口在 Operation 類中實(shí)現(xiàn)。調(diào)用Operation類時(shí)將自動(dòng)生成一個(gè)GUID,下面是Operation類的實(shí)現(xiàn):

public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
{
    public Operation() : this(Guid.NewGuid())
    {
    }
    public Operation(Guid id)
    {
        OperationId = id;
    }
    public Guid OperationId { get; private set; }
}

再注冊(cè)一個(gè)OperationService服務(wù)實(shí)例,當(dāng)通過依賴關(guān)系注入請(qǐng)求 OperationService 實(shí)例時(shí),它將接收每個(gè)服務(wù)的新實(shí)例或基于從屬服務(wù)(Operation)的生命周期的現(xiàn)有實(shí)例。OperationService 服務(wù)作用就是第二次調(diào)用 Operation類,查看Operation類實(shí)例的作用域變化。

public class OperationService
{
    public OperationService(
        IOperationTransient transientOperation,
        IOperationScoped scopedOperation,
        IOperationSingleton singletonOperation,
        IOperationSingletonInstance instanceOperation)
    {
        _transientOperation = transientOperation;
        _scopedOperation = scopedOperation;
        _singletonOperation = singletonOperation;
        _singletonInstanceOperation = instanceOperation;
    }
    public IOperationTransient _transientOperation { get; }
    public IOperationScoped _scopedOperation { get; }
    public IOperationSingleton _singletonOperation { get; }
    public IOperationSingletonInstance _singletonInstanceOperation { get; }
}

然后在Startup.ConfigureServices()服務(wù)容器中注冊(cè)各個(gè)生命周期的實(shí)例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IOperationTransient, Operation>();
    services.AddScoped<IOperationScoped, Operation>();
    services.AddSingleton<IOperationSingleton, Operation>();
    services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
    // OperationService depends on each of the other Operation types.
    services.AddTransient<OperationService, OperationService>();
}

再在IndexModel模塊里面調(diào)用OnGet方法輸出,觀察IOperation與OperationService類屬性O(shè)perationId 值的變化:

public class IndexModel : PageModel
{
    public OperationService _operationService { get; }
    public IOperationTransient _transientOperation { get; }
    public IOperationScoped _scopedOperation { get; }
    public IOperationSingleton _singletonOperation { get; }
    public IOperationSingletonInstance _singletonInstanceOperation { get; }
    public IndexModel(
    OperationService operationService,
    IOperationTransient transientOperation,
    IOperationScoped scopedOperation,
    IOperationSingleton singletonOperation,
    IOperationSingletonInstance singletonInstanceOperation)
    {
        _operationService = operationService;
        _transientOperation = transientOperation;
        _scopedOperation = scopedOperation;
        _singletonOperation = singletonOperation;
        _singletonInstanceOperation = singletonInstanceOperation;
    }
    public void OnGet()
    {
        Console.WriteLine("IOperation操作:");
        Console.WriteLine("暫時(shí):" + _transientOperation.OperationId.ToString());
        Console.WriteLine("作用域:" + _scopedOperation.OperationId.ToString());
        Console.WriteLine("單例:" + _singletonOperation.OperationId.ToString());
        Console.WriteLine("實(shí)例:" + _singletonInstanceOperation.OperationId.ToString());
        Console.WriteLine("OperationService操作:");
        Console.WriteLine("暫時(shí):" + _operationService._transientOperation.OperationId.ToString());
        Console.WriteLine("作用域:" + _operationService._scopedOperation.OperationId.ToString());
        Console.WriteLine("單例:" + _operationService._singletonOperation.OperationId.ToString());
        Console.WriteLine("實(shí)例:" + _operationService._singletonInstanceOperation.OperationId.ToString());
    }
}

執(zhí)行IndexModel 類輸出結(jié)果:

由圖總結(jié)如下:
2.1 Transient(暫時(shí)):每次調(diào)用服務(wù)的時(shí)候都會(huì)創(chuàng)建一個(gè)新的實(shí)例。即在IndexModel類的局部方法或?qū)傩灾校ㄟ@里是OnGet方法)實(shí)例化一個(gè)依賴對(duì)象Operation類,偽代碼是:

public class IndexModel: PageModel
{
    public void OnGet()
    {
          //調(diào)用IndexModel類時(shí),實(shí)例化了兩次Operation類
      //第一次
          OperationService operationService=new OperationService();
     //第二次
     IOperationTransient TransientOperation=new Operation();
    }
}

2.2 Scoped(作用域):一次請(qǐng)求(Action)內(nèi)對(duì)象實(shí)例是相同的,但每次請(qǐng)求會(huì)產(chǎn)生一個(gè)新實(shí)例。相當(dāng)于在IndexModel類的全局中實(shí)例化一次依賴對(duì)象Operation類,偽代碼是:

OperationService operationService = null;
public IndexModel()
{
    operationService = new OperationService();
    operationService._scopedOperation = new Operation();
}
public void OnGet()
{
    operationService._scopedOperation.OperationId;
    IOperationScoped operationScoped = operationService._scopedOperation;
    operationScoped.OperationId
}

2.3 Singleton(單例):首次請(qǐng)求初始化同一個(gè)實(shí)例,后續(xù)每次請(qǐng)求都使用同一個(gè)實(shí)例。相當(dāng)于在整個(gè)應(yīng)用Application中只實(shí)例化一次實(shí)例,常見的單例模式。

 生命周期流程圖如下:

到此這篇關(guān)于ASP.NET Core服務(wù)生命周期的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用

    ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用

    ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用...
    2006-12-12
  • .Net行為型設(shè)計(jì)模式之狀態(tài)模式(State)

    .Net行為型設(shè)計(jì)模式之狀態(tài)模式(State)

    這篇文章介紹了.Net行為型設(shè)計(jì)模式之狀態(tài)模式(State),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • ASP.NET?Core命令行界面CLI用法

    ASP.NET?Core命令行界面CLI用法

    這篇文章介紹了ASP.NET?Core命令行界面CLI的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • ASP.NET中 RadioButtonList 單選按鈕組控件的使用方法

    ASP.NET中 RadioButtonList 單選按鈕組控件的使用方法

    本文主要簡(jiǎn)單介紹RadioButtonList控件的常見屬性和使用方法,希望對(duì)大家有所幫助。
    2016-04-04
  • asp.net 專業(yè)源代碼打包工具

    asp.net 專業(yè)源代碼打包工具

    我想很多人都在網(wǎng)上下載過一些示例代碼,或者收到一些別人給的示例代碼。通常為了方便,都是打成一個(gè)壓縮包的形式
    2012-03-03
  • ASP.NET Core中間件

    ASP.NET Core中間件

    這篇文章介紹了ASP.NET Core的中間件,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • .Net?Core部署Docker容器

    .Net?Core部署Docker容器

    這篇文章介紹了.Net?Core部署Docker容器的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • .Net行為型設(shè)計(jì)模式之觀察者模式(Observer)

    .Net行為型設(shè)計(jì)模式之觀察者模式(Observer)

    這篇文章介紹了.Net行為型設(shè)計(jì)模式之觀察者模式(Observer),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • ASP.NET?Core之Web?API介紹

    ASP.NET?Core之Web?API介紹

    這篇文章介紹了ASP.NET?Core?Web?API,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • .Net報(bào)表開發(fā)控件XtraReport介紹

    .Net報(bào)表開發(fā)控件XtraReport介紹

    這篇文章介紹了.Net報(bào)表開發(fā)控件XtraReport,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論