123456789101112131415161718192021222324252627282930313233343536373839 |
- using System;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using Microsoft.Extensions.DependencyInjection;
- using Datory;
- namespace GxPress.Api.ServiceExtensions
- {
- public static class RepositoryExtension
- {
- /// <summary>
- /// 注入仓储
- /// </summary>
- /// <param name="services"></param>
- /// <returns></returns>
- public static IServiceCollection AddRepositories(this IServiceCollection services)
- {
- var baseType = typeof(IRepository);
- var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
- var referencedAssemblies = Directory.GetFiles(path, "GxPress.Repository.*.dll").Select(Assembly.LoadFrom).ToArray();
- var types = referencedAssemblies
- .SelectMany(a => a.DefinedTypes)
- .Select(type => type.AsType())
- .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
- var implementTypes = types.Where(x => x.IsClass).ToArray();
- var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
- foreach (var implementType in implementTypes)
- {
- var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
- if (interfaceType != null)
- services.AddScoped(interfaceType, implementType);
- }
- return services;
- }
- }
- }
|