.NET Core使用反射实现服务自动注入

本文介绍了如何在大型项目中通过Autofac和反射机制,避免手动为众多服务进行逐一注入,从而简化开发过程。作者提供了创建BaseService基类,使用GetReferanceAssemblies方法获取并自动注册所有继承该基类的子类的详细步骤。
摘要由CSDN通过智能技术生成

通常情况下我们都是在program.cs文件中依次注入我们需要的服务:

builder.Services.AddTransient(IUserService,UserService);

 但是,如果我们的项目变得庞大后,功能越来越多,就会有许多的服务需要我们去注入,这样会使得产生许多不必要的操作,因此我们可以使用Autofac来自动注入我们的服务。基本步骤如下: 

  1. 首先我们创建一个空的BaseService类
    public class BaseService
    {
    }
  2.  我们通过反射获取所有继承了这个类的子类并自动注入
    /// <summary>
    /// 获取所有继承BaseRepository的实现类并注册到DI容器中
    /// </summary>
    public static void AddClubService(this WebApplicationBuilder builder)
    {
        //获取所有程序集(包括未使用的)
        var assemblies = AppDomain.CurrentDomain.GetReferanceAssemblies();
        foreach (var assembly in assemblies)
        {
            if (typeof(BaseService).Assembly.Equals(assembly))
            {
                List<Type> types = assembly.GetTypes().Where(t => t.BaseType == typeof(BaseService)).ToList();
                types.ForEach(impl =>
                {
                    // 获取类实现的接口
                    Type[] interfaces = impl.GetInterfaces();
                    interfaces.ToList().ForEach(i =>
                    {
                        builder.Services.AddTransient(i, impl);
                    });
                });
            }
        }
    }

    这里我使用的是自定义的GetReferanceAssemblies()方法,而不是GetAssemblies(),是因为GetAssemblies只会获取已经使用过的程序集。GetReferanceAssemblies()方法内容如下:

    /// <summary>
    /// Assembly注入扩展,用于获取所有程序集,包括未使用过的
    /// </summary>
    public static class AssemblyExtension
    {
        public static List<Assembly> GetReferanceAssemblies(this AppDomain domain)
        {
            var list = new List<Assembly>();
            // 加载当前AppDomain中加载的所有程序集
            domain.GetAssemblies().ToList().ForEach(i =>
            {
                GetReferanceAssemblies(i, list);
            });
            return list;
        }
    
        /// <summary>
        /// 递归获取程序集的引用程序集
        /// </summary>
        /// <param name="assembly"></param>
        /// <param name="list"></param>
        static void GetReferanceAssemblies(Assembly assembly, List<Assembly> list)
        {
            // 获取指定程序集引用的所有程序集
            assembly.GetReferencedAssemblies().ToList().ForEach(i =>
            {
                // 加载引用的程序集
                var ass = Assembly.Load(i);
                if (!list.Contains(ass))
                {
                    list.Add(ass);
                    // 处理新增的程序集的引用程序集
                    GetReferanceAssemblies(ass, list);
                }
            });
        }
    }
  3. 此时我们在Program.cs中将此服务注入
    builder.AddClubService();

这样我们就实现了利用反射实现服务的自动注入

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.net开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值