7.1ASP.NET Core中的依赖注入

简介: ASP.Net中Program.cs文件中,第一行var builder = WebApplication.CreateBuilder(args)返回的类型为WebApplicationBuilder类型,在该类型中Services属性为IServiceCollection类型,也就是容器接口,一般把服务都注册到这个Service属性里面

7.1ASP.NET Core中的依赖注入

ASP.Net中Program.cs文件中,第一行var builder = WebApplication.CreateBuilder(args)返回的类型为WebApplicationBuilder类型,在该类型中Services属性为IServiceCollection类型,也就是容器接口,一般把服务都注册到这个Service属性里面

varbuilder=WebApplication.CreateBuilder(args);

builder.Services.AddControllers();//将项目中的控制器及相关的服务注册到容器中

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();//将Swagger相关服务注册到容器中

//当我们想注册服务的时候,主要把注册代码放到builder.Build()之前就可以

//注册代码的顺序不会影响程序运行的效果

varapp=builder.Build();

因为控制器被AddControllers()方法注册到了容器中,所以控制器中可以使用依赖注入的方式,在构造函数中依赖注入其他的类

publicclassMyService1

{

   publicIEnumerable<string>GetNames()

   {

       returnnewstring[] { "Tom", "Zack", "Jack" };

   }

}

//如果在var app = builder.Build();之前使用builder.Services.AddScoped<MyService1>();就可以像下面这样来注入服务了

publicclassTestController : ControllerBase

{

   privatereadonlyMyService1myService1;

   publicTestController(MyService1myService1)//构造函数,注入MyService1

   {

       this.myService1=myService1;

   }

   [HttpGet]

   publicstringTest()

   {

       varnames=myService1.GetNames();

       returnstring.Join(",", names);

   }

}

低频率服务的另类注入方式

如果一个类中有多个操作方法,这些操作方法用到的服务都要使用构造函数来注入(所有的服务都得包含进来,不管用不用)。如果一个操作方法用到的服务特别耗费资源并且使用频率低,则可以在操作方法中通过参数注入的方式,实现在执行某个方法的时候才注入特定的服务。

publicstringTest([FromServices]MyService1myService1, stringname) //只有在调用Test的时候,才注入MyService1,且不需要在构造函数中有

{

   varnames=myService1.GetNames();

   returnstring.Join(",", names) +",hello:"+name;

}

//建议多数还是要才去构造函数的方式来注入

//[FromServices]只有控制器类的操作方法才能这样用

案例

一个解决方案中会包含多个项目,并且解决方案中会引用各个项目,每个项目都会用到很多被注入的服务,所以我们需要在解决方案中把设计到的服务都要注册进去,这样就会很麻烦。现在开发一个案例来简化这些操作。

//创建接口和类

publicinterfaceImoduleInitializer

{

   publicvoidInitialize(IServiceCollectionservices);

}

publicstaticIServiceCollectionRunModuleInitializers(thisIServiceCollectionservices,IEnumerable<Assembly>assemblies)

{

   //扫描所有程序集中实现了IModuleInitializer的类

   foreach (varimplTypeinassemblies.SelectMany(asm=>  asm.GetTypes()).Where(t=>!t.IsAbstract&&typeof(IModuleInitializer).IsAssignableFrom(t))

   {

       //创建了ImoduleInitializer类

       varinitializer= (IModuleInitializer?)Activator.CreateInstance(implType);

       initializer.Initialize(services);

   }

   returnservices;

}

  1. 首先创建一个类库项目,并创建接口IMyService

publicinterfaceIMyService

{

   voidSayHello();

}

  1. 创建类库项目demo1,引用IMyService接口

publicclassCnService : IMyService

{

   publicvoidSayHello()

   {

       Console.WriteLine("你好");

   }

}

  1. 在demo1项目中创建IModuleInitializer的实现类ModuleInitializer

classModuleInitializer : IModuleInitializer

{

   publicvoidInitialize(IServiceCollectionservices)

   {

       services.AddScoped<IMyService, CnService>();//将CnService注册为IMyService的实现服务

   }

}

  1. 创建控制台程序,添加对上面项目的引用

ServiceCollectionservices=newServiceCollection();

varassemblies=ReflectionHelper.GetAllReferencedAssemblies();//获取用户的所有程序集,代码过长,没有在这里给出

services.RunModuleInitializers(assemblies);//扫描指定程序集中所有实现了IModuleInitializer的类,并调用Initialize方法

usingvarsp=services.BuildServiceProvider();

varitems=sp.GetServices<IMyService>();

foreach(variteminitems)

{

   item.SayHello();

}

//并没有注册CnService服务但是可以使用

相关文章
|
5天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
23 5
|
18天前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
14天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
22 3
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
253 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
246 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师
|
存储 开发框架 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- 连接字符串 - 异步编程 - 日志 - DbContext池 - 类和配置表 - 属性和列配置 - 并发token - 索引
309 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
- ORM - Repository 仓储 - UnitOfWork 工作单元 - DB Context 与 DB Set - EF Core快速开始示例
292 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记