设为首页 加入收藏

TOP

ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)(三)
2019-09-17 15:43:16 】 浏览:68
Tags:ASP.NET Core Web 应用程序 系列 使用 内置 IoC 容器 进行 批量 依赖 注入 MVC 当中 应用
问的时候使用,本demo主要为了简单介绍下如何使用ASP.NET Core内置的IoC容器DI进行批量依赖注入,故没有对该实体目录进行详细的讲解。

接下来就是重头戏了,我们在Extensions扩展目录中添加一个用于批量依赖注入的扩展类ServiceCollectionExtensions.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyModel;

using TianYa.DotNetShare.SharpCore.Model;

namespace TianYa.DotNetShare.SharpCore.Extensions
{
    /// <summary>
    /// ServiceCollection扩展
    /// </summary>
    public static class ServiceCollectionExtensions
    {
        #region 通过反射批量注入指定的程序集
        /// <summary>
        /// 通过反射批量注入指定的程序集
        /// </summary>
        /// <param name="services">服务</param>
        /// <param name="assemblyNames">程序集数组 如:["TianYa.DotNetShare.Repository","TianYa.DotNetShare.Service"],无需写dll</param>
        public static void RegisterTianYaSharpService(this IServiceCollection services, params string[] assemblyNames)
        {
            foreach (string assemblyName in assemblyNames)
            {
                foreach (var itemClass in GetClassInterfacePairs(assemblyName))
                {
                    foreach (var itemInterface in itemClass.Value)
                    {
                        if (itemInterface != typeof(DataBaseSetting))
                        {
                            services.AddTransient(itemInterface, itemClass.Key); //DI依赖注入
                        }
                    }
                }
            }
        }
        #endregion

        #region DI依赖注入辅助方法

        /// <summary>
        /// 获取类以及类实现的接口键值对
        /// </summary>
        /// <param name="assemblyName">程序集名称</param>
        /// <returns>类以及类实现的接口键值对</returns>
        private static Dictionary<Type, List<Type>> GetClassInterfacePairs(string assemblyName)
        {
            //存储 实现类 以及 对应接口
            Dictionary<Type, List<Type>> dic = new Dictionary<Type, List<Type>>();
            Assembly assembly = GetAssembly(assemblyName);
            if (assembly != null)
            {
                Type[] types = assembly.GetTypes();
                foreach (var item in types.AsEnumerable().Where(x => !x.IsAbstract && !x.IsInterface && !x.IsGenericType))
                {
                    dic.Add(item, item.GetInterfaces().Where(x => !x.IsGenericType).ToList());
                }
            }

            return dic;
        }

        /// <summary>
        /// 获取所有的程序集
        /// </summary>
        /// <returns>程序集集合</returns>
        private static List<Assembly> GetAllAssemblies()
        {
            var list = new List<Assembly>();
            var deps = DependencyContext.Default;
            var libs = deps.CompileLibraries.Where(lib => !lib.Serviceable && lib.Type != "package");//排除所有的系统程序集、Nuget下载包
            foreach (var lib in libs)
            {
                try
                {
                    var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
                    list.Add(assembly);
                }
                catch (Exception)
                {
                    // ignored
                }
            }
            return list;
        }

        /// <summary>
        /// 获取指定的程序集
        /// </summary>
        /// <param name="assemblyName">程序集名称</param>
        /// <returns>程序集</returns>
        private static Assembly GetAssembly(string assemblyName)
        {
            return GetAllAssemblies().FirstOrDefault(assembly => assembly.FullName.Contains(assemblyName));
        }

        #endregion
    }
}

并且添加一个Dynamic的扩展类DynamicExtensions.cs

using System;
using System.Collect
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇一般处理程序Session 下一篇(二十三)c#Winform自定义控件-..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目