Asp.Net Core入門之自定義服務註冊

lican123發表於2020-06-12

Asp.Net Core入門之自定義服務註冊

談到服務註冊,首先我們先了解一下服務註冊時使用的三種方式,也代表了不同的服務 生命週期

1  AddTransient 2  AddScoped 3  AddSingleton
AddSingleton生命週期最長,其生命週期範圍描述為:從應用程式啟動到應用程式結束。在第一次請求時會建立一個例項,之後的每次請求都會使用同一個例項。
AddTransient生命週期最短,在服務請求時會建立一個例項,服務請求結束生命週期即結束,之後的每一次請求都會建立不同的例項。

AddSingleton生命週期介於上述兩者之間,這裡用客戶端請求會話的概念來描述比較清晰一點,它也是在服務請求時建立例項,但是在同一個會話週期內,之後的每次請求都會使用同一個例項,直至會話結束才會建立新的例項。
 

ASP.Net Core框架支援我們以如下方式註冊我們自己的服務。

services.AddScoped<ITest, Test>();

其中第一個泛型型別(如:ITest)表示將要從容器中請求的型別(通常是一個介面)。第二個泛型型別(如:Test)表示將由容器例項化並且用於完成這些請求的具體實現類。

具體我們一起看下面的例子:

首先,我們建立一個需要實現查詢功能的服務介面ITest

   public interface ITest
    {
        Task<string> Get();
    }

然後,我們建立功能類Test實現這個介面

 1     public class Test : ITest 2     { 3         private readonly ILogger logger; 4         public Test(ILogger<Test> _logger) 5         { 6             logger = _logger; 7         } 8         public Task<string> Get() 9         {10             logger.LogInformation("自定義服務查詢");11             return Task.FromResult("Hello World");12         }13     }

最後,我們需要我們自己的服務註冊到容器中。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<ITest, Test>();
        }

以上我們便簡單完成了自定義服務的註冊。

隨後我這裡建立了一個Controller用以使用該服務。

 1     [Route("api/[controller]")] 2     [ApiController] 3     public class ValuesController : ControllerBase 4     { 5         //宣告服務 6         private readonly ITest service; 7  8         /// <summary> 9         /// 透過建構函式的方式注入自定義服務類10         /// </summary>11         /// <param name="_service"></param>12         public ValuesController(ITest _service)13         {14             service = _service;15         }16 17         /// <summary>18         /// 呼叫服務中實現的Get方法19         /// </summary>20         /// <returns></returns>21         [HttpGet]22         public Task<string> Get()23         {24             return service.Get();25         }26      }

ASP.Net Core框架預設支援我們以 建構函式的方式注入我們的服務以使用。

我想寫到這裡,大家也會有疑問,如果我們有很多service,這樣一個個註冊寫起來程式碼很低效,這裡我們簡單給大家介紹一種批次註冊的方式:

這裡我們建立了一個批次註冊服務派生類:

 1 public static class ServiceExtensions 2     { 3         /// <summary> 4         /// 批次註冊程式集下的服務類 5         /// </summary> 6         /// <param name="services"></param> 7         public static IServiceCollection AddBatchServices(this IServiceCollection services) 8         { 9             //根據指定程式集名稱獲取待註冊服務10             var batchServices = GetConfigureClass("WebApiApplication");11             foreach (var type in batchServices)12             {13                 type.Value.ToList().ForEach(i =>14                 {15                     //註冊服務類16                     services.AddScoped(i, type.Key);17                 });18             }19             return services;20         }21 22         /// <summary>23         /// 根據程式集名稱獲取自定義服務24         /// </summary>25         /// <param name="assembly"></param>26         /// <returns></returns>27         public static Dictionary<Type, Type[]> GetConfigureClass(string assembly)28         {29             Dictionary<Type, Type[]> dic = new Dictionary<Type, Type[]>();30             if (!string.IsNullOrEmpty(assembly))31             {32                 //獲取程式集對應的型別33                 Assembly dll = Assembly.LoadFrom(assembly);34                 List<Type> lstType = dll.GetTypes().ToList();35                 lstType.ForEach(x =>36                 {37                     //篩選滿足條件的服務類38                     if (x.IsClass && x.GetInterfaces().Length > 0)39                     {40                         dic.Add(x, x.GetInterfaces());41                     }42                 });43             }44             return dic;45         }46    }

然後我們ConfigureServices方法中註冊:

        public void ConfigureServices(IServiceCollection services)
        {            //批次註冊            services.AddBatchServices();
        }

對於批次註冊,ASP.Net Core允許我們更換預設的IOC容器,感興趣的同學可以試試AutoFac容器支援的程式集掃描式註冊。

註冊我們自己的服務,往往在專案開發過程中是必要的,希望以上簡單的分享能給需要的小夥伴們帶來一點收貨。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69973775/viewspace-2697845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章