日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何在.net6webapi中使用自動依賴注入

瀏覽:18日期:2022-06-14 13:25:21
目錄IOC/DI如何在.net6webapi中使用依賴注入?怎么實現自動注入?IOC/DI

IOC(Inversion of Control)控制反轉:控制反正是一種設計思想,旨在將程序中的控制權從程序員轉移到了容器中。容器負責管理對象之間的依賴關系,使得對象不再直接依賴于其他對象,而是通過依賴注入的方式來獲取所需的資源。

DI(Dependency Injection)依賴注入:他是IOC的具體實現方式之一,使用最為廣泛,DI通過在運行時動態地將某個依賴關系抽象為獨立的組件,提交到容器之中,需要使用時再由容器注入,提升組件重用的頻率,為系統搭建一個靈活,可擴展的平臺。

IOC/DI是一種設計模式,用于解耦組件之間的依賴關系。在傳統的編程模式中,組件之間的依賴關系是硬編碼在代碼中的,這樣會導致代碼的耦合度很高,難以維護和發展。而IOC/DI模式則是通過將組件之間的依賴關系交給容器來管理,組件不再直接依賴其他組件,而是通過容器來獲取所依賴的對象。這樣可以使組件之間的依賴關系更加靈活,容器可以根據需要動態地創建和管理組件,從而實現更好的可維護性和可擴展性。

如何在.net6webapi中使用依賴注入?

首先我們定義一個服務接口及對應的實現

public interface ITestServices {int return123(); } public class TestServices : ITestServices {public int return123(){ return 123;} }

然后我們在Program.cs注入服務實現

var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();builder.Services.AddTransient<ITestServices, TestServices>();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();

值得注意的是依賴注入有三種生命周期

作用域(Scoped):在應用程序啟動時創建,并在應用程序關閉時銷毀。這種類型的服務實例會被容器管理,但是只會被當前請求使用。當請求結束時,該服務實例會被銷毀。單例(Singleton):在應用程序啟動時創建,并在整個應用程序運行期間保持不變。這種類型的服務實例會被容器管理,并且可以被多個請求共享。瞬時(Transient):在應用程序啟動時創建,并在應用程序關閉時銷毀。這種類型的服務實例不會被容器管理,也不會被其他服務引用。

最后在需要使用的控制器中構造函數注入就可以使用了

[Route('[controller]/[action]')] [ApiController] public class TestController : ControllerBase {private readonly ITestServices _testServices;public TestController(ITestServices testServices){ _testServices= testServices;}[HttpGet]public int Get123() => _testServices.return123(); }

怎么實現自動注入?

依賴注入好歸好,就是每個服務都得在Program.cs注入服務實現,一但服務多起來,麻煩不說,Program.cs中的代碼更是會變得凌亂不堪,可能會有小伙伴說,可以開一個擴展函數單獨做注入,但私以為,既然有一種方法可以一勞永逸,何樂而不為呢?

其實現便是利用.net的高級特性之一,反射

首先我們定義三個生命周期接口,其對應依賴注入的三種生命周期

//瞬時注入服務接口 public interface ITransient { } //作用域注入服務接口 public interface IScoped { } //單例注入服務接口 public interface ISingleton { }

然后我們定義自動注入的擴展方法,其為核心實現

public static IServiceCollection RegisterAllServices(this IServiceCollection services){ //獲取當前程序集 var entryAssembly = Assembly.GetEntryAssembly(); //獲取所有類型 //!. null包容運算符,當你明確知道表達式的值不為null 使用!.(即null包容運算符)可以告知編譯器這是預期行為,不應發出警告 //例: entryAssembly!.GetReferencedAssemblies() 正常 //entryAssembly.GetReferencedAssemblies() 編譯器判斷entryAssembly有可能為null,變量下方出現綠色波浪線警告 var types = entryAssembly!.GetReferencedAssemblies()//獲取當前程序集所引用的外部程序集.Select(Assembly.Load)//裝載.Concat(new List<Assembly>() { entryAssembly })//與本程序集合并.SelectMany(x => x.GetTypes())//獲取所有類.Distinct();//排重 //三種生命周期分別注冊 Register<ITransient>(types, services.AddTransient, services.AddTransient); Register<IScoped>(types, services.AddScoped, services.AddScoped); Register<ISingleton>(types, services.AddSingleton, services.AddSingleton); return services;}/// <summary>/// 根據服務標記的生命周期interface,不同生命周期注冊到容器里面/// </summary>/// <typeparam name='TLifetime'>注冊的生命周期</typeparam>/// <param name='types'>集合類型</param>/// <param name='register'>委托:成對注冊</param>/// <param name='registerDirectly'>委托:直接注冊服務實現</param>private static void Register<TLifetime>(IEnumerable<Type> types, Func<Type, Type, IServiceCollection> register, Func<Type, IServiceCollection> registerDirectly){ //找到所有標記了Tlifetime生命周期接口的實現類 var tImplements = types.Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Any(tinterface => tinterface == typeof(TLifetime))); //遍歷,挨個以其他所有接口為key,當前實現為value注冊到容器中 foreach (var t in tImplements) {//獲取除生命周期接口外的所有其他接口var interfaces = t.GetInterfaces().Where(x => x != typeof(TLifetime));if (interfaces.Any()){ foreach (var i in interfaces) {register(i, t); }}//有時需要直接注入實現類本身registerDirectly(t); }}

其核心邏輯便是通過反射掃描程序集,當掃描到實現了我們定義的生命周期接口時,為其實現對應的生命周期注入。

注冊這個服務

builder.Services.RegisterAllServices();

然后我們就可以通過繼承生命周期接口來實現自動服務注入

public interface ITestServices {int return123(); } public class TestServices : ITestServices, ITransient {public int return123(){ return 123;} }

接下來無需在Program.cs注入服務實現

調用成功。

到此這篇關于如何在.net6webapi中實現自動依賴注入的文章就介紹到這了,更多相關.net6webapi自動依賴注入內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品三p一区二区| sm久久捆绑调教精品一区| 群体交乱之放荡娇妻一区二区| 国产一区二区三区网| 久久久免费人体| 国产精品大片| 久久伊人国产| 成人欧美一区二区三区的电影| 国产午夜久久av| 国产麻豆精品久久| 免费看一区二区三区| 美女尤物国产一区| 精品国产亚洲日本| 久久一区视频| 国产+成+人+亚洲欧洲在线| 97精品国产福利一区二区三区| 91亚洲自偷观看高清| 黑人精品一区| 久久精品免费一区二区三区| 女同性一区二区三区人了人一| 一本一道久久a久久精品蜜桃| 首页国产欧美日韩丝袜| 日韩在线黄色| 你懂的国产精品| 国产精品一区2区3区| 精品一区二区三区中文字幕| 国产一区二区三区视频在线| 岛国av在线网站| 久久久久亚洲| 蜜桃av一区二区在线观看| 91欧美精品| 麻豆精品新av中文字幕| 精品国产a一区二区三区v免费| 国产一区二区三区久久久久久久久| а√天堂8资源在线| 怡红院精品视频在线观看极品| 中文字幕日韩亚洲| 欧美国产先锋| 欧美jjzz| 中文在线一区| 日本aⅴ亚洲精品中文乱码| 国产精品亲子伦av一区二区三区 | 久久婷婷国产| 欧美日韩国产观看视频| 午夜欧美理论片| 亚州国产精品| 久久伊人亚洲| 欧美一区二区三区高清视频| 一区二区视频欧美| 91成人精品观看| 日本午夜大片a在线观看| 鲁大师影院一区二区三区| 国产免费av国片精品草莓男男| 国产夫妻在线| 美女被久久久| 美女精品久久| 99视频在线精品国自产拍免费观看| 日韩在线成人| 国产在线看片免费视频在线观看| 蜜桃成人av| 日韩不卡手机在线v区| 日韩专区精品| 日本一不卡视频| 欧美13videosex性极品| 伊人久久成人| 麻豆91精品视频| 狠狠色综合网| 国产精品久久久久久久久久白浆 | 婷婷精品久久久久久久久久不卡| 欧美有码在线| 激情久久婷婷| 日韩精品视频在线看| 欧美日韩xxxx| 激情视频网站在线播放色| 视频一区日韩精品| 蜜桃精品在线| 热久久久久久| 国产亚洲亚洲| 国产一区二区三区探花| 蜜桃久久精品一区二区| 97精品在线| 国产欧美日韩在线观看视频| 激情综合网站| 日本欧美在线| 国产精品丝袜xxxxxxx| 久久a爱视频| 精品一区二区三区中文字幕视频| 亚洲国产不卡| 正在播放日韩精品| 伊人精品视频| 国产精品亚洲综合色区韩国 | 日韩av午夜在线观看| 国产精品三p一区二区| 日韩精品诱惑一区?区三区| 红桃视频欧美| 国产+成+人+亚洲欧洲在线| 蜜臀av亚洲一区中文字幕| 国产精品片aa在线观看| 日本 国产 欧美色综合| 999久久久精品国产| 国产精品xxx| 日韩二区在线观看| 99热精品在线观看| 久久天堂av| 国产精品亚洲一区二区在线观看| 亚洲欧美视频一区二区三区| 日韩免费小视频| 国产精品嫩模av在线| 四虎精品一区二区免费| 亚洲大全视频| 国产精品精品| 91午夜精品| 婷婷久久免费视频| 免费观看在线色综合| 久久蜜桃av| 韩国精品主播一区二区在线观看 | 免费久久99精品国产| 国产精品99精品一区二区三区∴| 欧美a在线观看| 一区二区自拍| 美国三级日本三级久久99 | 国产精品久久久久毛片大屁完整版| 天堂av在线一区| 五月婷婷亚洲| 亚洲少妇自拍| 免费av一区| 色婷婷精品视频| 亚洲欧洲美洲av| 吉吉日韩欧美| 老司机精品视频在线播放| 欧美一区在线观看视频| 日韩国产一区二| 日韩精品一区二区三区中文字幕| 亚洲午夜国产成人| 亚洲欧洲专区| 亚洲精品进入| 国产探花一区| 精品中文在线| 高潮一区二区| 亚洲天堂成人| 日韩午夜av在线| 免费观看在线综合| 日韩中文字幕视频网| 国产精品亚洲二区| 久久精品xxxxx| 99久久久久| 综合激情婷婷| 奶水喷射视频一区| 欧美中文一区二区| 99久久www免费| 亚洲成人不卡| 久久先锋影音| 亚洲天堂1区| 亚洲日产国产精品| 日韩视频1区| 日韩欧美三区| 亚洲天堂成人| 久久中文字幕二区| 国产精品一区亚洲| 日韩欧美另类中文字幕| 日本电影久久久| 久久的色偷偷| 国产成人精品亚洲日本在线观看| 在线一区av| 亚洲精品97| 亚洲精品成a人ⅴ香蕉片| 国产精品久久久久久久久久白浆 | 免费在线观看成人| 久久精品99久久久| 国模大尺度视频一区二区| 久久精品91| 日本强好片久久久久久aaa| 国产欧美自拍| 国产精品成人国产| caoporn视频在线| 国产一区导航| 国产精品一区高清| 欧洲在线一区| 男人天堂欧美日韩| 精品中文字幕一区二区三区四区| 亚洲另类黄色| 激情综合在线| 国产精品a久久久久| 国产欧美在线观看免费| 久久爱www成人| 国产欧美视频在线| 亚洲开心激情| 日韩精品一页| 成人看片网站| 国产欧美高清视频在线| 国产成人久久精品一区二区三区| 日韩在线观看一区| 久久av一区| 奇米亚洲欧美| 国产欧美69| 性色av一区二区怡红| 五月国产精品| 国产suv精品一区| 午夜在线视频一区二区区别| 亚洲影视一区|