posted at 2020.11.7 07:36 by Administrator
随着网站项目的完善,会增加很多的服务类。在Asp.Net Core中,我们需要在ConfigureServices()方法中配置大量的服务到依赖注入容器中,微软自带Microsoft.Dependency Injection,通过services.AddTransient、services.AddScoped、services.AddSingleton这些方法实现构造函数注入,微软给自行注入的服务,提供了3种生命周期:Transient(瞬时的),即每次请求时都会创建的瞬时生命周期服务。这个生命周期最适合轻量级,无状态的服务。Scoped(作用域的),即在同作用域,服务每个请求只创建一次。Singleton(唯一的),即全局只创建一次,第一次被请求的时候被创建,然后就一直使用这一个。
大量的服务注入一旦忘记注册,容易引起系统异常。使用组件是克服这一缺陷的好办法,很多人习惯使用Autofac作为依赖注入组件,当然Autofac组件的功能比较多,但同样它也占用了一定的内存。NetCore.AutoRegisterDi(以下简称AutoR)是一个开源库,最新版v2.1.0大小仅309K,简单、高效是它的特色。
让我们了解一下如何使用AutoR。
打开项目文件,在系统中添加AutoR,然后还原程序包,代码如下:
<ItemGroup>
<PackageReference Include="NetCore.AutoRegisterDi" Version="2.1.0" />
</ItemGroup>
然后在ConfigureServices()方法中添加以下代码,同时注释或删除以前的注册方式。
//自动注入服务到依赖注入容器
services.RegisterAssemblyPublicNonGenericClasses()
.Where(c => c.Name.EndsWith("Service"))
.AsPublicImplementedInterfaces();
//services.AddScoped<IPhotoGraphService, PhotoGraphService>();
//services.AddScoped<ICommentService, CommentService>();
代码说明如下:
1、 RegisterAssemblyPublicNonGenericClasses()方法用于查找所有类,我们通过筛选可以查询所有名称以Service结尾的类。
2、 AsPublicImplementedInterfaces()方法用于查询每个公共接口,排除非嵌套接口后,将每个接口的实现类都写入依赖注入容器中。
3、 默认情况下,每个类的注册生命周期都是ServiceLifetime.Transient,我们可以通过参数配置来修改它。
最终的代码是:
//自动注入服务到依赖注入容器
services.RegisterAssemblyPublicNonGenericClasses()
.Where(c => c.Name.EndsWith("Service"))
.AsPublicImplementedInterfaces(ServiceLifetime.Scoped);
这里所有的生命周期都是Scoped类型。
这样,AutoR使我们只需要按照既定规范,就可以完成服务的自动注册。
以下是AutoR的开源链接:
120d8db7-b61f-4378-ac27-855532a4841f|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: 程序, 代码, 方法, 接口, 类, 依赖注入
IT技术