网站服务的自动注册AutoR

posted at 2020.11.7 07:36 by Administrator

 随着网站项目的完善,会增加很多的服务类。在Asp.Net Core中,我们需要在ConfigureServices()方法中配置大量的服务到依赖注入容器中,微软自带Microsoft.Dependency Injection,通过services.AddTransientservices.AddScopedservices.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的开源链接:

 

Tags: , , , , ,

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading