电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:2日期: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
主站蜘蛛池模板: 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 科普仪器菏泽市教育教学仪器总厂 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 国际学校_国际学校哪个好_国际课程学校-国际学校择校网 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 车载加油机品牌_ 柴油加油机厂家 | 软启动器-上海能曼电气有限公司| 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 云南成考网_云南成人高考报名网 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 智慧养老_居家养老_社区养老_杰佳通| 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 光谱仪_积分球_分布光度计_灯具检测生产厂家_杭州松朗光电【官网】 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 广东青藤环境科技有限公司-水质检测 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 热闷罐-高温罐-钢渣热闷罐-山东鑫泰鑫智能热闷罐厂家 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 电动葫芦|手拉葫芦|环链电动葫芦|微型电动葫芦-北京市凌鹰起重机械有限公司 |