/// <summary> /// 加载模块服务 /// </summary> /// <param name="services">服务容器</param> /// <returns></returns> public virtual IServiceCollection LoadPacks(IServiceCollection services) { IOFoodPackTypeFinder packTypeFinder = services.GetOrAddTypeFinder <IOFoodPackTypeFinder>(assemblyFinder => new OsharpPackTypeFinder(assemblyFinder)); Type[] packTypes = packTypeFinder.FindAll(); _sourcePacks.Clear(); _sourcePacks.AddRange(packTypes.Select(m => (OFoodPack)Activator.CreateInstance(m))); IOFoodBuilder builder = services.GetSingletonInstance <IOFoodBuilder>(); List <OFoodPack> 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 <OFoodPack> dependPacks = new List <OFoodPack>(); foreach (OFoodPack pack in packs) { Type[] dependPackTypes = pack.GetDependPackTypes(); foreach (Type dependPackType in dependPackTypes) { OFoodPack dependPack = _sourcePacks.Find(m => m.GetType() == dependPackType); if (dependPack == null) { throw new OFoodException($"加载模块{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 (OFoodPack pack in LoadedPacks) { services = pack.AddServices(services); } return(services); }
/// <summary> /// 将OFood服务,各个<see cref="OFoodPack"/>模块的服务添加到服务容器中 /// </summary> public static IServiceCollection AddOFood <TOFoodPackManager>(this IServiceCollection services, Action <IOFoodBuilder> builderAction = null) where TOFoodPackManager : IOFoodPackManager, new() { services.CheckNotNull(nameof(services)); //初始化所有程序集查找器 services.TryAddSingleton <IAllAssemblyFinder>(new AppDomainAllAssemblyFinder()); IOFoodBuilder builder = services.GetSingletonInstanceOrNull <IOFoodBuilder>() ?? new OFoodBuilder(); builderAction?.Invoke(builder); services.TryAddSingleton <IOFoodBuilder>(builder); TOFoodPackManager manager = new TOFoodPackManager(); services.AddSingleton <IOFoodPackManager>(manager); manager.LoadPacks(services); return(services); }
/// <summary> /// 添加CorePack /// </summary> public static IOFoodBuilder AddCorePack(this IOFoodBuilder builder) { return(builder.AddPack <OFoodCorePack>()); }