专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

.Net Core 自动扫描注入之Scrutor批量依赖注入

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:03:51       共计:3618 浏览

.NET Core中依赖注入已经是最常见的编程方式,所以基于约定进行自动依赖注入非常有必要,可以简化工作量和减少出错的概率,


目前进行自动扫描注入的工具为Scrutor,通过一个接口锚点进行自动扫描注入,如下述的IAutoInject,IScopedAutoInject   等接口就是锚点


分为2种注入方式:


1.接口实现类型的注入,如services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();


2.注入自身    services.AddScoped<RequestToHttpHelper>();


其中:


1.IAutoInject :默认以接口和实现的方式注入Scoped 例:services.AddScoped<ITest, TestImplment>();


2.IScopedAutoInject  :以接口和实现的方式注入Scoped(同上)例:services.AddScoped<ITest, TestImplment>();


3.ISingletonAutoInject:自动注入接口和实现Singleton类型 例:services.AddSingleton<ITest, TestImplment>();


4.ITransientAutoInject:自动注入接口和实现Transient类型  例:services.AddTransient<ITest, TestImplment>();


5.ISelfScopedAutoInject:自动注入自身Scoped类型  例:services.AddScoped<Test>();


6.ISelfSingletonAutoInject:自动注入自身Singleton类型 例:services.AddSingleton<Test>();


7.ISelfTransientAutoInject:自动注入自身Transient类型 例:services.AddTransient<Test>();


代码如下:



using Microsoft.Extensions.DependencyInjection;

using Scrutor;

using System.Reflection;

using System.Collections.Generic;

using System.Linq;

using Microsoft.AspNetCore.Http;


namespace NetCore3WebApiTemplate

{

   public static class RegisterService

   {

       public static void RegisterComponents(IServiceCollection services)

       {

           

           //自动注入IAutoInject

           services.Scan(x =>

           {

               var entryAssembly = Assembly.GetEntryAssembly();

               var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);

               var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies);


               x.FromAssemblies(assemblies)

                   .AddClasses(classes => classes.AssignableTo(typeof(IAutoInject)))

                       .AsImplementedInterfaces()

                       .WithScopedLifetime()

                       //接口注册Scoped

                   .AddClasses(classes => classes.AssignableTo(typeof(IScopedAutoInject)))

                       .AsImplementedInterfaces()

                       .WithScopedLifetime()

                   //接口注册Singleton

                   .AddClasses(classes => classes.AssignableTo(typeof(ISingletonAutoInject)))

                         .AsImplementedInterfaces()

                         .WithSingletonLifetime()

                  //接口注册Transient

                   .AddClasses(classes => classes.AssignableTo(typeof(ITransientAutoInject)))

                         .AsImplementedInterfaces()

                         .WithTransientLifetime()

                   //具体类注册Scoped

                   .AddClasses(classes => classes.AssignableTo(typeof(ISelfScopedAutoInject)))

                         .AsSelf()

                         .WithScopedLifetime()

                   //具体类注册Singleton

                   .AddClasses(classes => classes.AssignableTo(typeof(ISelfSingletonAutoInject)))

                         .AsSelf()

                         .WithSingletonLifetime()

                   //具体类注册Transient

                   .AddClasses(classes => classes.AssignableTo(typeof(ISelfTransientAutoInject)))

                         .AsSelf()

                         .WithTransientLifetime();

           });

       }

   }

}




using System;

using System.Collections.Generic;

using System.Text;


namespace NetCore3WebApiTemplate

{

   /// <summary>

   /// 自动注入扫描点默认为Scoped

   /// </summary>

   public interface IAutoInject

   {

   }


   /// <summary>

   ///  自动注入接口和实现Scoped类型

   /// </summary>

   public interface IScopedAutoInject

   {


   }


   /// <summary>

   /// 自动注入接口和实现Singleton类型

   /// </summary>

   public interface ISingletonAutoInject

   {


   }


   /// <summary>

   /// 自动注入接口和实现Transient类型

   /// </summary>

   public interface ITransientAutoInject

   {


   }


   /// <summary>

   /// 自动注入自身Scoped类型

   /// </summary>

   public interface ISelfScopedAutoInject

   {


   }


   /// <summary>

   /// 自动注入自身Singleton类型

   /// </summary>

   public interface ISelfSingletonAutoInject

   {


   }


   /// <summary>

   /// 自动注入自身Transient类型

   /// </summary>

   public interface ISelfTransientAutoInject

   {


   }

}




使用方式如下:



public class TestImplment:ITest,IAutoInject

{

   

}





public class CompanyController : ControllerBase

  {

      private readonly ITest test;


      public CompanyController(ITest test)

      {

          this.test= test;

      }

  }




在startup的ConfigureServices的方法追加RegisterService.RegisterComponents(services);即可,代码如下



/// <summary>

       /// This method gets called by the runtime. Use this method to add services to the container.

       /// </summary>

       /// <param name="services"></param>

       public void ConfigureServices(IServiceCollection services)

       {

          //注册服务

           RegisterService.RegisterComponents(services);

      }




注意:RegisterService所在项目需要引用需要扫描的注入接口和类,不然无法扫描到。



版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:英译汉,汉译英 | ·下一条:ASP.NET Core开发-获取所有注入(DI)服务

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有