- public static class ServiceExtension
- {/// <summary>
- /// 用 DI 批量注入接口程序集中对应的实现类.
- /// </summary>
- /// <param name="service"></param>
- /// <param name="interfaceAssemblyName"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterAssembly(this IServiceCollection service, string interfaceAssemblyName)
- {
- if (service == null)
- throw new ArgumentNullException(nameof(service));
- if (string.IsNullOrEmpty(interfaceAssemblyName))
- throw new ArgumentNullException(nameof(interfaceAssemblyName));
- var assembly = RuntimeHelper.GetAssembly(interfaceAssemblyName);
- if (assembly == null)
- {
- throw new DllNotFoundException($"the dll \"{interfaceAssemblyName}\"not be found");
- }
- // 过滤掉非接口及泛型接口
- var types = assembly.GetTypes().Where(t => t.GetTypeInfo().IsInterface && !t.GetTypeInfo().IsGenericType);
- foreach (var type in types)
- {
- var implementTypeName = type.Name.Substring(1);
- var implementType = RuntimeHelper.GetImplementType(implementTypeName, type);
- if (implementType != null)
- service.AddSingleton(type, implementType);
- }
- return service;
- }
- /// <summary>
- /// 用 DI 批量注入接口程序集中对应的实现类.
- /// </summary>
- /// <param name="service"></param>
- /// <param name="interfaceAssemblyName"> 接口程序集的名称 (不包含文件扩展名)</param>
- /// <param name="implementAssemblyName"> 实现程序集的名称 (不包含文件扩展名)</param>
- /// <returns></returns>
- public static IServiceCollection RegisterAssembly(this IServiceCollection service, string interfaceAssemblyName, string implementAssemblyName)
- {
- if (service == null)
- throw new ArgumentNullException(nameof(service));
- if (string.IsNullOrEmpty(interfaceAssemblyName))
- throw new ArgumentNullException(nameof(interfaceAssemblyName));
- if (string.IsNullOrEmpty(implementAssemblyName))
- throw new ArgumentNullException(nameof(implementAssemblyName));
- var interfaceAssembly = RuntimeHelper.GetAssembly(interfaceAssemblyName);
- if (interfaceAssembly == null)
- {
- throw new DllNotFoundException($"the dll \"{interfaceAssemblyName}\"not be found");
- }
- var implementAssembly = RuntimeHelper.GetAssembly(implementAssemblyName);
- if (implementAssembly == null)
- {
- throw new DllNotFoundException($"the dll \"{implementAssemblyName}\"not be found");
- }
- // 过滤掉非接口及泛型接口
- var types = interfaceAssembly.GetTypes().Where(t => t.GetTypeInfo().IsInterface && !t.GetTypeInfo().IsGenericType);
- foreach (var type in types)
- {
- // 过滤掉抽象类, 泛型类以及非 class
- var implementType = implementAssembly.DefinedTypes
- .FirstOrDefault(t => t.IsClass && !t.IsAbstract && !t.IsGenericType &&
- t.GetInterfaces().Any(b => b.Name == type.Name));
- if (implementType != null)
- {
- service.AddSingleton(type, implementType.AsType());
- }
- }
- return service;
- }
- }
来源: https://www.cnblogs.com/sportsky/p/9400419.html