/// <summary> /// 加载模块服务 /// </summary> /// <param name="services">服务容器</param> /// <returns></returns> public virtual IServiceCollection LoadPacks(IServiceCollection services) { IOsharpPackTypeFinder packTypeFinder = services.GetOrAddTypeFinder<IOsharpPackTypeFinder>(assemblyFinder => new OsharpPackTypeFinder(assemblyFinder)); Type[] packTypes = packTypeFinder.FindAll(); _sourcePacks.Clear(); _sourcePacks.AddRange(packTypes.Select(m => (OsharpPack)Activator.CreateInstance(m))); IOsharpBuilder builder = services.GetSingletonInstance<IOsharpBuilder>(); List<OsharpPack> packs; if (builder.AddPacks.Any()) { packs = _sourcePacks.Where(m => m.Level == PackLevel.Core) .Union(_sourcePacks.Where(m => builder.AddPacks.Contains(m.GetType()))).Distinct().ToList(); IEnumerable<Type> dependModuleTypes = packs.SelectMany(m => m.GetDependModuleTypes()); packs = packs.Union(_sourcePacks.Where(m => dependModuleTypes.Contains(m.GetType()))).Distinct().ToList(); } else { packs = _sourcePacks.ToList(); packs.RemoveAll(m => builder.ExceptPacks.Contains(m.GetType())); } packs = packs.OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); LoadedPacks = packs; foreach (OsharpPack pack in LoadedPacks) { services = pack.AddServices(services); } return services; }
private static List <OsharpPack> GetAllPacks(IServiceCollection services) { IOsharpPackTypeFinder packTypeFinder = services.GetOrAddTypeFinder <IOsharpPackTypeFinder>(assemblyFinder => new OsharpPackTypeFinder(assemblyFinder)); Type[] packTypes = packTypeFinder.FindAll(); return(packTypes.Select(m => (OsharpPack)Activator.CreateInstance(m)).ToList()); }
/// <summary> /// 加载模块服务 /// </summary> /// <param name="services">服务容器</param> /// <returns></returns> public virtual IServiceCollection LoadPacks(IServiceCollection services) { IOsharpPackTypeFinder packTypeFinder = services.GetOrAddTypeFinder <IOsharpPackTypeFinder>(assemblyFinder => new OsharpPackTypeFinder(assemblyFinder)); Type[] packTypes = packTypeFinder.FindAll(); _sourcePacks.Clear(); _sourcePacks.AddRange(packTypes.Select(m => (OsharpPack)Activator.CreateInstance(m))); IOsharpBuilder builder = services.GetSingletonInstance <IOsharpBuilder>(); List <OsharpPack> packs; if (builder.AddPacks.Any()) { packs = _sourcePacks.Where(m => m.Level == PackLevel.Core) .Union(_sourcePacks.Where(m => builder.AddPacks.Contains(m.GetType()))).Distinct() .OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); List <OsharpPack> dependPacks = new List <OsharpPack>(); foreach (OsharpPack pack in packs) { Type[] dependPackTypes = pack.GetDependPackTypes(); foreach (Type dependPackType in dependPackTypes) { OsharpPack dependPack = _sourcePacks.Find(m => m.GetType() == dependPackType); if (dependPack == null) { throw new OsharpException($"加载模块{pack.GetType().FullName}时无法找到依赖模块{dependPackType.FullName}"); } dependPacks.AddIfNotExist(dependPack); } } packs = packs.Union(dependPacks).Distinct().ToList(); } else { packs = _sourcePacks.ToList(); packs.RemoveAll(m => builder.ExceptPacks.Contains(m.GetType())); } // 按先层级后顺序的规则进行排序 packs = packs.OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); LoadedPacks = packs; foreach (OsharpPack pack in LoadedPacks) { services = pack.AddServices(services); } return(services); }