如何在.net6 webapi中使用自动依赖注入

2025-12-13 0 465

IOC/DI

IOC(Inversion of Control)控制反转:控制反正是一种设计思想,旨在将程序中的控制权从程序员转移到了容器中。容器负责管理对象之间的依赖关系,使得对象不再直接依赖于其他对象,而是通过依赖注入的方式来获取所需的资源。

DI(Dependency Injection)依赖注入:他是IOC的具体实现方式之一,使用最为广泛,DI通过在运行时动态地将某个依赖关系抽象为独立的组件,提交到容器之中,需要使用时再由容器注入,提升组件重用的频率,为系统搭建一个灵活,可扩展的平台。

IOC/DI是一种设计模式,用于解耦组件之间的依赖关系。在传统的编程模式中,组件之间的依赖关系是硬编码在代码中的,这样会导致代码的耦合度很高,难以维护和发展。而IOC/DI模式则是通过将组件之间的依赖关系交给容器来管理,组件不再直接依赖其他组件,而是通过容器来获取所依赖的对象。这样可以使组件之间的依赖关系更加灵活,容器可以根据需要动态地创建和管理组件,从而实现更好的可维护性和可扩展性。

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

首先我们定义一个服务接口及对应的实现

1

2

3

4

publicinterfaceITestServices

{

intreturn123();

}

1

2

3

4

5

6

7

publicclassTestServices : ITestServices

{

publicintreturn123()

{

return123;

}

}

然后我们在Program.cs注入服务实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

builder.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):在应用程序启动时创建,并在应用程序关闭时销毁。这种类型的服务实例不会被容器管理,也不会被其他服务引用。

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

1

2

3

4

5

6

7

8

9

10

11

12

[Route(\”[controller]/[action]\”)]

[ApiController]

publicclassTestController : ControllerBase

{

privatereadonlyITestServices _testServices;

publicTestController(ITestServices testServices)

{

_testServices= testServices;

}

[HttpGet]

publicintGet123() => _testServices.return123();

}

如何在.net6 webapi中使用自动依赖注入

如何在.net6 webapi中使用自动依赖注入

怎么实现自动注入?

依赖注入好归好,就是每个服务都得在Program.cs注入服务实现,一但服务多起来,麻烦不说,Program.cs中的代码更是会变得凌乱不堪,可能会有小伙伴说,可以开一个扩展函数单独做注入,但私以为,既然有一种方法可以一劳永逸,何乐而不为呢?

其实现便是利用.net的高级特性之一,反射

首先我们定义三个生命周期接口,其对应依赖注入的三种生命周期

1

2

3

4

5

6

7

8

9

//瞬时注入服务接口

publicinterfaceITransient

{ }

//作用域注入服务接口

publicinterfaceIScoped

{ }

//单例注入服务接口

publicinterfaceISingleton

{ }

然后我们定义自动注入的扩展方法,其为核心实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

publicstaticIServiceCollection RegisterAllServices(thisIServiceCollection services)

{

//获取当前程序集

var entryAssembly = Assembly.GetEntryAssembly();

//获取所有类型

//!. null包容运算符,当你明确知道表达式的值不为null 使用!.(即null包容运算符)可以告知编译器这是预期行为,不应发出警告

//例: entryAssembly!.GetReferencedAssemblies() 正常

//entryAssembly.GetReferencedAssemblies() 编译器判断entryAssembly有可能为null,变量下方出现绿色波浪线警告

var types = entryAssembly!.GetReferencedAssemblies()//获取当前程序集所引用的外部程序集

.Select(Assembly.Load)//装载

.Concat(newList<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);

returnservices;

}

/// <summary>

/// 根据服务标记的生命周期interface,不同生命周期注册到容器里面

/// </summary>

/// <typeparam name=\”TLifetime\”>注册的生命周期</typeparam>

/// <param name=\”types\”>集合类型</param>

/// <param name=\”register\”>委托:成对注册</param>

/// <param name=\”registerDirectly\”>委托:直接注册服务实现</param>

privatestaticvoidRegister<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 tintImplements)

{

//获取除生命周期接口外的所有其他接口

var interfaces = t.GetInterfaces().Where(x => x !=typeof(TLifetime));

if(interfaces.Any())

{

foreach(var iininterfaces)

{

register(i, t);

}

}

//有时需要直接注入实现类本身

registerDirectly(t);

}

}

其核心逻辑便是通过反射扫描程序集,当扫描到实现了我们定义的生命周期接口时,为其实现对应的生命周期注入。

注册这个服务

1

builder.Services.RegisterAllServices();

然后我们就可以通过继承生命周期接口来实现自动服务注入

1

2

3

4

publicinterfaceITestServices

{

intreturn123();

}

1

2

3

4

5

6

7

publicclassTestServices : ITestServices, ITransient

{

publicintreturn123()

{

return123;

}

}

接下来无需在Program.cs注入服务实现

如何在.net6 webapi中使用自动依赖注入

如何在.net6 webapi中使用自动依赖注入

调用成功。

到此这篇关于如何在.net6webapi中实现自动依赖注入的文章就介绍到这了,更多相关.net6webapi自动依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 如何在.net6 webapi中使用自动依赖注入 https://www.zuozi.net/36331.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务