NET6 通过接口完成自动注入

根据NETCore的注入方式添加三个接口

/// <summary>
/// 瞬时注入服务接口
/// </summary>
public interface ITransient
{
}

/// <summary>
/// 作用域注入服务接口
/// </summary>
public interface IScoped
{
}

/// <summary>
/// 单例注入服务接口
/// </summary>
public interface ISingleton
{
}

自动注入的核心代码

/// <summary>
/// 自动注入的扩展方法
/// </summary>
public static class AutoRegisterHelper
{
    /// <summary>
    /// 自动注入的扩展方法
    /// </summary>
    /// <param name="services"></param>
    /// <returns></returns>
    public static IServiceCollection CustAutoRegister(this IServiceCollection services)
    {
        //  需要自动注入的程序集名称
        var registerDllNameList = new List<string> {
            "BLL","DAL"
        };
        var assemblyList = new List<Assembly>();
        foreach (var itemName in registerDllNameList)
            assemblyList.Add(Assembly.Load(itemName));
        var types = assemblyList.SelectMany(x => x.GetTypes())//获取所有类
            .Distinct()//排重
            .Where(x => x.IsClass && !x.IsAbstract)//排除无效数据
            .ToList();

        //    分别注册三种生命周期
        Register<ITransient>(types, services.AddTransient, services.AddTransient);
        Register<IScoped>(types, services.AddScoped, services.AddScoped);
        Register<ISingleton>(types, services.AddSingleton, services.AddSingleton);

        return services;
    }

    /// <summary>
    /// 根据服务标记的生命周期interface,不同生命周期注册到容器里面
    /// </summary>
    /// <typeparam name="TLifetime">注册的生命周期</typeparam>
    /// <param name="types">集合类型</param>
    /// <param name="register">委托:成对注册</param>
    /// <param name="registerDirectly">委托:直接注册服务实现</param>
    private static void Register<TLifetime>(IEnumerable<Type> types, Func<Type, Type, IServiceCollection> register, Func<Type, IServiceCollection> registerDirectly)
    {
        //找到所有标记了Tlifetime生命周期接口的实现类
        var tImplements = types.Where(x => x.GetInterfaces().Any(tinterface => tinterface == typeof(TLifetime))).ToList();

        //遍历,挨个以其他所有接口为key,当前实现为value注册到容器中
        foreach (var t in tImplements)
        {
            //获取除生命周期接口外的所有其他接口
            var interfaces = t.GetInterfaces().Where(x => x != typeof(TLifetime));
            if (interfaces.Any())
            {
                foreach (var i in interfaces)
                {
                    register(i, t);
                }
            }

            //  有时需要直接注入实现类本身
            //registerDirectly(t);
        }
    }
}

 

 

 

 
posted @ 2024-07-12 16:02  Robot-Blog  阅读(3)  评论(0编辑  收藏  举报