日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

轻量级.Net Core服务注册工具CodeDi发布啦

發布時間:2023/12/4 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻量级.Net Core服务注册工具CodeDi发布啦 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么做這么一個工具

因為我們的系統往往時面向接口編程的,所以在開發Asp .net core項目的時候,一定會有大量大接口及其對應的實現要在ConfigureService注冊到ServiceCollection中,傳統的做法是加了一個服務,我們就要注冊一次(service.AddService()),又比如,當一個接口有多個實現,在構造函數中獲取服務也不是很友好,而據我所知, .Net Core目前是沒有什么自帶的庫或者方法解決這些問題,當然,如果引入第三方容器如AutoFac這些問題時能迎刃而解的,但是如何在不引入第三方容器來解決這個問題呢?
所以我就設計了這樣的一個輕量級工具.

首先,放上該項目的Github地址(記得Star哦!!)

https://github.com/liuzhenyulive/CodeDi

CodeDi是一個基于 .Net Standard的工具庫,它能幫助我們自動地在Asp .net core或者 .net core項目中完成服務的注冊.

Overview

CodeDi 是 Code Dependency Injection的意思,在上次我在看了由依樂祝寫的<.NET Core中的一個接口多種實現的依賴注入與動態選擇看這篇就夠了>后,回想起我之前遇到的那些問題,感覺撥云見日,所以,我就開始著手寫這個工具了.

如何使用CodeDi

安裝Nuget包

CodeDi的Nuget包已經發布到了 nuget.org,您可以通過以下指令在您的項目中安裝CodeDi

Install-Package CodeDi

ConfigureServices中的配置

方法 1

您可以在Startup的ConfigureService方法中添加AddCodeDi完成對CodeDi的調用.服務的注冊CodeDi會自動為您完成.


方法 2

您也可以在AddCodeDi方法中傳入一個Action<CodeDiOptions>參數,在這個action中,您可以對CodeDiOptions的屬性進行配置.


方法 3

當然您也可以直接給AddCodeDi()方法直接傳入一個CodeDiOptions實例.


你也可以在appsetting.json文件中配置CodeDiOptions的信息,并通過Configuration.Bind("CodeDiOptions", options)把配置信息綁定到一個CodeDiOptions實例.

appsetting.json file


ConfigureService方法


CodeDiOptions詳解

屬性名稱屬性描述數據類型默認值
AssemblyPaths在指定目錄下加載Dll程序集string[]Bin目錄
AssemblyNames選擇要加載的程序集名稱 (支持通配符)string[]*
IgnoreAssemblies忽略的程序集名稱 (支持通配符)string[]null
IncludeSystemAssemblies是否包含系統程序集(當為false時,會忽略含有System,Microsoft,CppCodeProvider,WebMatrix,SMDiagnostics,Newtonsoft關鍵詞和在App_Web,App_global目錄下的程序集)boolfalse
IgnoreInterface忽略的接口 (支持通配符)string[]null
InterfaceMappings接口對應的服務 (支持通配符) ,當一個接口有多個實現時,如果不進行配置,則多個實現都會注冊到SerciceCollection中Dictionary<string, string>null
DefaultServiceLifetime默認的服務生命周期ServuceLifetime( Singleton,Scoped,Transient)ServiceLifetime.Scope
ServiceLifeTimeMappings指定某個接口的服務生命周期,不指定為默認的生命周期Dictionary<string, ServiceLifetime>null

InterfaceMappings

如果?ISay?接口有SayInChinese?和SayInEnglish?兩個實現,我們只想把SayInEnglish注冊到ServiceCollection中

那么我們可以這樣配置InterfaceMappings.

options.InterfaceMappings=new Dictionary<string, string>(){{ "ISay", "SayInChinese" } }

也就是{接口名稱(支持通配符),實現名稱(支持通配符)}

ServiceLifeTimeMappings

如果我們希望ISay接口的服務的生命周期為Singleton,我們可以這樣配置ServiceLifeTimeMappings.

options.ServiceLifeTimeMappings = new Dictionary<string, ServiceLifetime>(){{"*Say",ServiceLifetime.Singleton}};

也就是也就是{接口名稱(支持通配符),Servicelifetime}

關于ServiceLifetime: https://github.com/aspnet/DependencyInjection/blob/master/src/DI.Abstractions/ServiceLifetime.cs

獲取服務實例

當然, 您可以和之前一樣,直接在構造函數中進行依賴的注入,但是當某個接口有多個實現而且都注冊到了ServiceCollection中,獲取就沒有那么方便了,您可以用ICodeDiServiceProvider?來幫助您獲取服務實例.

例如,當?ISay?接口有?SayInChinese?和?SayInEnglish兩個實現, 我們我們如何獲取我們想要的服務實例呢?



ICodeDiServiceProvider.GetService<T>(string name=null)
參數中的Name支持通配符.

CodeDi如何實現的?

既然是一個輕量級工具,那么實現起來自然不會太復雜,我來說說比較核心的代碼.


GetInterfaceMapping通過反射機制,首先獲取程序集中的所有接口allInterfaces,然后遍歷allInterfaces找到該接口對應的實現,最終,該方法返回接口和實現的匹配關系,為Dictionary<Type, List>類型的數據.


該方法要判斷CodeDiOptions中是否忽略了該接口,同時,是否指定實現映射關系.
什么叫實現映射關系呢?參見InterfaceMappings
如果指定了,那么就按指定的來實現,如果沒指定,就會把每個實現都注冊到ServiceCollection中.


AddToService中,要判斷有沒有對接口的生命周期進行配置,參見ServiceLifeTimeMappings,如果沒有配置,就按DefaultServiceLifetime進行配置,DefaultServiceLifetime如果沒有修改的情況下時ServiceLifetime.Scoped,即每個Request創建一個實例.


這CodeDiServiceProvider的實現代碼,這里參考了依樂祝寫的<.NET Core中的一個接口多種實現的依賴注入與動態選擇看這篇就夠了>給出的一種解決方案,即當某個接口注冊了多個實現,其實可以通過IEnumerable獲取所有的實現,CodeDiServiceProvider對其進行了封裝.

Enjoy it

只要進行一次簡單的CodeDi配置,以后系統中添加了新的接口以及對應的服務實現后,就不用再去一個個地Add到IServiceCollection中了.

如果有問題,歡迎Issue,歡迎PR.
最后,賞個Star唄!?前往Star

原文地址:https://www.cnblogs.com/CoderAyu/p/10269610.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


總結

以上是生活随笔為你收集整理的轻量级.Net Core服务注册工具CodeDi发布啦的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。