如何在Asp.NetCore中使用生命周期選項(xiàng)-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)如何在Asp.Net Core中使用生命周期選項(xiàng),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!

 一、服務(wù)的生命周期


在Asp.Net Core中,內(nèi)置容器負(fù)責(zé)管理服務(wù)的生命周期,從被依賴注入容器創(chuàng)建開始,等我們調(diào)用完服務(wù)時(shí),到容器釋放該服務(wù)的所有實(shí)力為止,有幾種形式表現(xiàn):

1、Transient:每次請求服務(wù)時(shí),都會(huì)創(chuàng)建一個(gè)新實(shí)例,這種生命周期適合用于輕量級服務(wù)(如Repository和ApplicationService服務(wù))。

2、Scoped:為每個(gè)HTTP請求創(chuàng)建一個(gè)實(shí)例,生命周期將橫貫整次請求。

3、SingleTon:在第一次請求服務(wù)時(shí),為該服務(wù)創(chuàng)建一個(gè)實(shí)例,之后每次請求將會(huì)使用第一次創(chuàng)建好的服務(wù)。

4、Instance:與SingleTon類似,但在應(yīng)用程序啟動(dòng)時(shí)會(huì)將該實(shí)例注冊到容器中,可以理解為比SingleTon還早存在。

應(yīng)用程序中相關(guān)服務(wù)的控制生命周期的方法時(shí)通過相應(yīng)的Add*指定,如下三種,當(dāng)然還可以通過擴(kuò)展方法來簡化ConfigurationServices方法中所見的代碼數(shù)量。

services.AddTransient<IApplicationService, ApplicationService>();
services.AddScoped<IApplicationService, ApplicationService>();
services.AddSingleton<IApplicationService, ApplicationService>();

二、代碼設(shè)計(jì)服務(wù)生命周期

首先設(shè)計(jì)一些服務(wù)相關(guān)的操作接口

public interface IOperation
 {
 Guid GetGuid();
 }

 public interface IOperationTransient: IOperation
 {

 }

 public interface IOperationScoped : IOperation
 {

 }

 public interface IOperationSingleton : IOperation
 {
 
 }

 public interface IOperationInstance : IOperation
 {
 
 }

基礎(chǔ)服務(wù)接口

其次對這些操作類予以實(shí)現(xiàn)并生成相關(guān)服務(wù)

/// <summary>
 /// 常規(guī)服務(wù)
 /// </summary>
 public class Operation : IOperation
 {
 private readonly Guid _guid;

 public Operation()
 {
 _guid = Guid.NewGuid();
 }

 public Operation(Guid guid)
 {
 _guid = guid == Guid.Empty ? Guid.NewGuid() : guid;
 }

 public Guid GetGuid()
 {
 return _guid;
 }
 }

 /// <summary>
 /// 瞬時(shí)服務(wù)
 /// </summary>
 public class OperationTransient : IOperationTransient
 {
 private readonly Guid _guid;

 public OperationTransient()
 {
 _guid = Guid.NewGuid();
 }

 public OperationTransient(Guid guid)
 {
 _guid = guid == Guid.Empty ? Guid.NewGuid() : guid;
 }

 public Guid GetGuid()
 {
 return _guid;
 }
 }

 /// <summary>
 /// 單次請求內(nèi)服務(wù)固定
 /// </summary>
 public class OperationScoped : IOperationScoped
 {
 private readonly Guid _guid;

 public OperationScoped()
 {
 _guid = Guid.NewGuid();
 }

 public OperationScoped(Guid guid)
 {
 _guid = guid == Guid.Empty ? Guid.NewGuid() : guid;
 }

 public Guid GetGuid()
 {
 return _guid;
 }
 }


 /// <summary>
 /// 所有請求內(nèi)固定服務(wù)
 /// </summary>
 public class OperationSingleton : IOperationSingleton
 {
 private readonly Guid _guid;

 public OperationSingleton()
 {
 _guid = Guid.NewGuid();
 }

 public OperationSingleton(Guid guid)
 {
 _guid = guid == Guid.Empty ? Guid.NewGuid() : guid;
 }

 public Guid GetGuid()
 {
 return _guid;
 }
 }

 /// <summary>
 /// 應(yīng)用程序內(nèi)固定服務(wù)
 /// </summary>
 public class OperationInstance : IOperationInstance
 {
 private readonly Guid _guid;

 public OperationInstance()
 {
 _guid = Guid.NewGuid();
 }

 public OperationInstance(Guid guid)
 {
 _guid = guid == Guid.Empty ? Guid.NewGuid() : guid;
 }

 public Guid GetGuid()
 {
 return _guid;
 }
 }

基礎(chǔ)服務(wù)具體實(shí)現(xiàn)

對基礎(chǔ)服務(wù)的聚合接口,提供統(tǒng)一服務(wù)接口

public interface IOperationService
 {
 /// <summary>
 /// 獲取四種形式的Guid碼
 /// </summary>
 /// <returns></returns>
 List<string> GetGuidString();
 }

聚合服務(wù)接口

對基礎(chǔ)服務(wù)的聚合實(shí)現(xiàn),將基礎(chǔ)服務(wù)全部接入進(jìn)來作為統(tǒng)一服務(wù)

/// <summary>
 /// 服務(wù)調(diào)用
 /// </summary>
 public class OperationService : IOperationService
 {
 public IOperationTransient _transientOperation { get; }
 public IOperationScoped _scopedOperation { get; }
 public IOperationSingleton _singletonOperation { get; }
 public IOperationInstance _instanceOperation { get; }

 public OperationService(IOperationTransient transientOperation,
 IOperationScoped scopedOperation,
 IOperationSingleton singletonOperation,
 IOperationInstance instanceOperation)
 {
 _transientOperation = transientOperation;
 _scopedOperation = scopedOperation;
 _singletonOperation = singletonOperation;
 _instanceOperation = instanceOperation;
 }

 public List<string> GetGuidString()
 {
 return new List<string>()
 {
 $"Transient:"+_transientOperation.GetGuid(),
 $"Scoped:"+_scopedOperation.GetGuid(),
 $"Singleton:" +_singletonOperation.GetGuid(),
 $"Instance:"+_instanceOperation.GetGuid(),
 };
 }
 }

聚合服務(wù)的實(shí)現(xiàn)

在控制器中進(jìn)行服務(wù)注入

[Route("api/[controller]")]
 [ApiController]
 public class ValuesController : ControllerBase
 {
 private readonly IOperationService _operationService;

 public ValuesController(IOperationService operationService)
 {
 _operationService = operationService;
 }

 [HttpGet]
 [Route(nameof(GetGuidString))]
 public ActionResult<string> GetGuidString()
 {
 return string.Join("\n", _operationService.GetGuidString());
 }
 }

在StartUp中完成服務(wù)注入邏輯,這里實(shí)現(xiàn)服務(wù)注入的方式多種均可。

services.AddTransient<IOperationTransient, OperationTransient>();
services.AddScoped<IOperationScoped, OperationScoped>();
services.AddSingleton<IOperationSingleton, OperationSingleton>();//應(yīng)用程序啟動(dòng)時(shí)便注入該實(shí)例
services.AddSingleton<IOperationInstance>(new OperationInstance(Guid.Empty));
services.AddTransient<IOperationService, OperationService>();

通過訪問預(yù)期Api地址可以得到不同的四種基礎(chǔ)服務(wù)的Guid信息,

第一次啟動(dòng)程序(不關(guān)閉)發(fā)起訪問:

如何在Asp.Net Core中使用生命周期選項(xiàng)

第二次(第一次基礎(chǔ)上再次訪問)發(fā)起訪問:

如何在Asp.Net Core中使用生命周期選項(xiàng)

可以看見,兩次訪問下,Singleton和Instance是相同的,都是由應(yīng)用程序啟動(dòng)時(shí)和應(yīng)用服務(wù)加載時(shí)決定完畢,Singleton在首次進(jìn)入服務(wù)時(shí)進(jìn)行分配,并始終保持不變,而Instance在應(yīng)用程序啟動(dòng)時(shí),便將實(shí)例注入,進(jìn)入服務(wù)也保持著最先的實(shí)例,沒有重新分配實(shí)例。而Transient和Scoped則進(jìn)行著變化。

關(guān)閉程序,重啟,第三次發(fā)起訪問:

如何在Asp.Net Core中使用生命周期選項(xiàng)

可以見到,Singleton和Instance都發(fā)生了變化,也說明了之前在Singleton和Instance處寫上的作用。

接下來開始設(shè)計(jì)Transient和Scoped的不同之處,對于已有代碼加上新功能,此次我們只針對Scoped和Transient進(jìn)行比較。

首先在StartUp中將HttpContextAccessor服務(wù)注入,目的是在后期能夠針對Scoped獲取新的服務(wù)實(shí)例(盡管兩個(gè)實(shí)例是相同的)。

 services.AddHttpContextAccessor();

接著在聚合服務(wù)中增加一個(gè)方法,用來針對Transient、Scoped測試。

 /// <summary>
 /// 獲取Transient、Scoped的Guid碼
 /// </summary>
 /// <returns></returns>
 List<string> GetTransientAndScopedGuidString();

在聚合服務(wù)實(shí)現(xiàn)中實(shí)現(xiàn)該方法并對已有的服務(wù)重新獲取實(shí)例,得到不同實(shí)例下的Guid碼。

public List<string> GetTransientAndScopedGuidString()
 {
 //var tempTransientService = (IOperationTransient)ServiceLocator.Instance.GetService(typeof(IOperationTransient));

 var tempTransientService = (IOperationTransient)_httpContextAccessor.HttpContext.RequestServices.GetService(typeof(IOperationTransient));
 var tempScopedService = (IOperationScoped)_httpContextAccessor.HttpContext.RequestServices.GetService(typeof(IOperationScoped));

 return new List<string>()
 {
 $"原生Transient請求服務(wù):"+_transientOperation.GetGuid(),
 $"手動(dòng)Transient請求服務(wù):"+ tempTransientService.GetGuid(),
 $"原生Scoped請求服務(wù):"+_scopedOperation.GetGuid(),
 $"手動(dòng)Scoped請求服務(wù):"+tempScopedService.GetGuid(),
 };
 }

在控制器部分調(diào)用該聚合服務(wù)即可,并返回相應(yīng)的結(jié)果,本次我返回的結(jié)果:

如何在Asp.Net Core中使用生命周期選項(xiàng)

ASP.NET 是什么

ASP.NET 是開源,跨平臺(tái),高性能,輕量級的 Web 應(yīng)用構(gòu)建框架,常用于通過 HTML、CSS、JavaScript 以及服務(wù)器腳本來構(gòu)建網(wǎng)頁和網(wǎng)站。

關(guān)于如何在Asp.Net Core中使用生命周期選項(xiàng)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前題目:如何在Asp.NetCore中使用生命周期選項(xiàng)-創(chuàng)新互聯(lián)
地址分享:http://bm7419.com/article34/ijdse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站改版品牌網(wǎng)站制作、小程序開發(fā)用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作