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服务但是可以使用

相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
27 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
22天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
37 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
52 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
44 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
118 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
184 0