网站服务的自动注册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技术

Add comment

  Country flag

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading