" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Core服務生命周期

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

1.前言

在ConfigureServices方法中的容器注冊每個應用程序的服務,Asp.Core都可以為每個應用程序提供三種服務生命周期:

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

2.服務生命周期與注冊選項案例演示

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

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

上面四種服務接口在 Operation 類中實現(xiàn)。調用Operation類時將自動生成一個GUID,下面是Operation類的實現(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; }
}

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

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()服務容器中注冊各個生命周期的實例:

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模塊里面調用OnGet方法輸出,觀察IOperation與OperationService類屬性OperationId 值的變化:

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("暫時:" + _transientOperation.OperationId.ToString());
        Console.WriteLine("作用域:" + _scopedOperation.OperationId.ToString());
        Console.WriteLine("單例:" + _singletonOperation.OperationId.ToString());
        Console.WriteLine("實例:" + _singletonInstanceOperation.OperationId.ToString());
        Console.WriteLine("OperationService操作:");
        Console.WriteLine("暫時:" + _operationService._transientOperation.OperationId.ToString());
        Console.WriteLine("作用域:" + _operationService._scopedOperation.OperationId.ToString());
        Console.WriteLine("單例:" + _operationService._singletonOperation.OperationId.ToString());
        Console.WriteLine("實例:" + _operationService._singletonInstanceOperation.OperationId.ToString());
    }
}

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

由圖總結如下:
2.1 Transient(暫時):每次調用服務的時候都會創(chuàng)建一個新的實例。即在IndexModel類的局部方法或屬性中(這里是OnGet方法)實例化一個依賴對象Operation類,偽代碼是:

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

2.2 Scoped(作用域):一次請求(Action)內對象實例是相同的,但每次請求會產生一個新實例。相當于在IndexModel類的全局中實例化一次依賴對象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(單例):首次請求初始化同一個實例,后續(xù)每次請求都使用同一個實例。相當于在整個應用Application中只實例化一次實例,常見的單例模式。

 生命周期流程圖如下:

到此這篇關于ASP.NET Core服務生命周期的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解.net循環(huán)、邏輯語句塊(基礎知識)

    詳解.net循環(huán)、邏輯語句塊(基礎知識)

    本篇是介紹.NET 基礎部分,主要簡述循環(huán),判斷,對初學者具有很好的參考借鑒價值,下面就跟小編一起來看下吧
    2016-12-12
  • 抓取頁面信息方法介紹

    抓取頁面信息方法介紹

    我們知道,一般網頁中的信息是不斷翻新的,這也要求我們定期的去抓這些新信息,但是這個“定期”該怎么理解,也就是多長時間需要
    抓一次該頁面,其實這個定期也就是頁面緩存時間,在頁面的緩存時間內我們再次抓取該網頁是沒有必要的,反而給人家服務器造成壓力
    2012-11-11
  • .Net?Core微服務rpc框架GRPC通信實際運用

    .Net?Core微服務rpc框架GRPC通信實際運用

    這篇文章介紹了.Net?Core微服務rpc框架GRPC通信實際運用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • 使用Docker部署ASP.NET?Core程序

    使用Docker部署ASP.NET?Core程序

    這篇文章介紹了使用Docker部署ASP.NET?Core程序的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET Table 表格控件的使用方法

    ASP.NET Table 表格控件的使用方法

    使用 Table 控件可以在 ASP.NET 網頁上創(chuàng)建服務器可編程的表格。如果要創(chuàng)建的是靜態(tài)表格(運行時不會在其中添加或更改內容的表格),則應使用 HTML 表格,而不是 Table 控件。
    2016-04-04
  • asp.net中的cookie使用介紹

    asp.net中的cookie使用介紹

    asp.net中的cookie使用介紹,這里腳本之家將一些asp.net中的cookie操作方法整理下,需要的朋友可以參考下
    2012-05-05
  • asp.net OleDbCommand 的用法

    asp.net OleDbCommand 的用法

    asp.net下OleDbCommand的使用代碼
    2008-04-04
  • ASP.NET中HttpContext對象下的屬性介紹

    ASP.NET中HttpContext對象下的屬性介紹

    這篇文章介紹了ASP.NET中HttpContext對象下的屬性,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • asp.net TreeView與XML三步生成列表樹

    asp.net TreeView與XML三步生成列表樹

    只要三個步驟就可以生成平時很常用的樹狀列表,看代碼就可以明白。
    2013-10-10
  • .NET4.0版本中基于任務的異步模式(TAP)

    .NET4.0版本中基于任務的異步模式(TAP)

    這篇文章介紹了.NET4.0版本中基于任務的異步模式(TAP),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

吐鲁番市| 东丽区| 时尚| 汉源县| 长岛县| 巫山县| 神农架林区| 类乌齐县| 胶南市| 渝中区| 宜昌市| 杂多县| 沙洋县| 元阳县| 秦安县| 徐州市| 广德县| 扶余县| 平罗县| 喀喇沁旗| 陇川县| 宣城市| 岗巴县| 称多县| 上蔡县| 白城市| 桂平市| 太保市| 鄂尔多斯市| 红安县| 玛沁县| 霸州市| 平度市| 舒城县| 霍州市| 静宁县| 深州市| 堆龙德庆县| 吉木乃县| 铜川市| 毕节市|