/// <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;
        }
Example #2
0
        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());
        }
Example #3
0
        /// <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);
        }