Beispiel #1
0
        /// <summary>
        /// 生成所有脚本
        /// </summary>
        public virtual void GenerateAll()
        {
            // 清空上次生成的集合
            GeneratedDtoTypes.Clear();
            GeneratedApplicationServices.Clear();
            GeneratedTranslationLanguages.Clear();
            // 生成应用服务的脚本
            var applicationServices = ZKWeb.Application.Ioc.ResolveMany <ApplicationServiceBase>();

            foreach (var applicationService in applicationServices)
            {
                // 生成数据传输对象的脚本
                foreach (var method in applicationService.GetApiMethods())
                {
                    // 生成返回类型
                    GenerateDtoScript(method.ReturnType);
                    // 生成参数类型
                    foreach (var parameter in method.Parameters)
                    {
                        GenerateDtoScript(parameter.Type);
                    }
                }
                // 生成应用服务的脚本
                GenerateServiceScript(applicationService);
            }
            // 生成翻译的脚本
            var languages = ZKWeb.Application.Ioc.ResolveMany <ILanguage>();

            foreach (var language in languages)
            {
                GenerateTranslationScript(language.Name);
            }
            // 生成翻译的索引脚本
            GenerateTranslationIndexScript();
            // 生成用户类型和权限列表的脚本
            GeneratePrivilegesScript();
            // 生成模块的脚本
            GenerateModuleScript();
        }
        /// <summary>
        /// 根据数据传输对象生成脚本,并写入到文件
        /// </summary>
        protected virtual void GenerateDtoScript(Type type)
        {
            // 递归生成所有关联的对象传输对象
            // 例如 class A { B b; } 的时候可以生成A和B的脚本
            var generator       = ZKWeb.Application.Ioc.Resolve <DtoScriptGenerator>();
            var pathConfig      = ZKWeb.Application.Ioc.Resolve <ScriptPathConfig>();
            var discoveredTypes = new List <Type>()
            {
                type
            };

            while (discoveredTypes.Count > 0)
            {
                // 出栈
                var discoveredType = discoveredTypes[discoveredTypes.Count - 1];
                discoveredTypes.RemoveAt(discoveredTypes.Count - 1);
                // 如果不需要生成或已经生成过则跳过
                if (!generator.ShouldGenerate(discoveredType) ||
                    GeneratedDtoTypes.Contains(discoveredType))
                {
                    continue;
                }
                // 生成此类型的脚本
                var script   = generator.GenerateScript(discoveredType, discoveredTypes);
                var filename = pathConfig.NormalizeFilename(
                    pathConfig.NormalizeClassName(discoveredType)) + ".ts";
                var path = PathUtils.SecureCombine(
                    pathConfig.GenerateModuleDirectory,
                    pathConfig.DtosDirectoryName,
                    filename);
                PathUtils.EnsureParentDirectory(path);
                if (!File.Exists(path) || File.ReadAllText(path) != script)
                {
                    File.WriteAllText(path, script);
                }
                // 添加到已生成的集合
                GeneratedDtoTypes.Add(discoveredType);
            }
        }