Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 /// <summary>
 /// 添加CorePack
 /// </summary>
 public static IOFoodBuilder AddCorePack(this IOFoodBuilder builder)
 {
     return(builder.AddPack <OFoodCorePack>());
 }