想个性化定制一套Blog.Core项目?请看这里

想个性化定制一套Blog.Core项目?请看这里_第1张图片

一、故事回顾

书接上文,上篇咱们说到了我们可以将不同的配置文件给拆开,从而实现分治的思路,同时也做了一个投票——《在BlogCore中,将配置文件做可读性拆分》,这里也简单说下最终的结果:

想个性化定制一套Blog.Core项目?请看这里_第2张图片

从结果上来看,在近60个小伙伴投票中,还是建议拆开的,而且也对新手比较友好,尤其修改的时候,也是能找到指定的地方,最后发布的时候,也会合并成一个文件,和之前的开发模式也不会有任何的冲突,我个人也是表示支持分开的。

特别是和BCVP开发组的其他开发人员讨论过后,也都是认为,其实应该拆分,而且不光是文件,或者配置文件的拆分,更多的还是应该向微服务上走,将服务和配置也做一个拆分,可以做成一个类库,或者直接一个nuget的形式,以插件化的思维来统一项目,做成一个可拔插可扩展的多组件框架模式。无独有偶,在上篇的第二个投票中,也是更多的人来关注和建议将这个功能,作为下一步框架设计的重点和需要考虑的地方。

想个性化定制一套Blog.Core项目?请看这里_第3张图片

那我和开发组的小伙伴,今年就往这个方向思考思考,努努力吧,争取继续为.NET社区做贡献,打造更好用的微服务框架。

其实关于拆分配置文件和自定义服务扩展,还能对另一个功能起到举足轻重的好处,这个功能好几年前我就在想了,一直苦于没有好的思路和方案,那就是给框架做一个完全可以个性化定制的“BlogCore”框架,那下面,我就说说具体是一个什么功能设计。

想个性化定制一套Blog.Core项目?请看这里_第4张图片

二、新功能设计初衷

在很久之前,我就考虑着将项目做成一个可任意功能配置的平台,功能虽然很多,但是都是插件化的思维,可以任意添加和卸载,用户只需要指定指定的功能,就只包含指定的功能,这样不仅有利于新手入门;也能针对不同企业,做不同的定制化;同时也能方便各个社区小伙伴贡献自己的插件。

但是受限于前期设计是一个大而全的,配置也很全,导致不好分割,所以迟迟没实现,虽然做了一个CreateYourProject.bat,用户可以创建自己的项目,但是只不过是名字变了,有些不需要的功能,还是只能手动删除,有时候删多了,可能还报错。正好这次在BCVP开发组小伙伴的思路和上篇文章中,配置文件拆分的思路,才让我有了对新功能的进一步设计动力,那就是打造一个平台功能,可以生成一个任意可定制的个性化项目。我目前也简单做了一部分,先迫不及待地给大家展示下。

想个性化定制一套Blog.Core项目?请看这里_第5张图片

三、定制化设计思路

因为还是半成品,所以项目我就先不开源了,感兴趣的小伙伴可以私聊,或者评论留言,也可以一起参与开发中。目前设计思路大概是这样的:

1$ 初始化新项目

这一步和之前一样,还是创建一个新的大而全的项目,只不过需要用户在网站平台上,输入一个自己的名字:

想个性化定制一套Blog.Core项目?请看这里_第6张图片

然后这里是用接口的形式,把项目生成到服务器里,(也很简单,就是调用了一个可执行文件),给每一个用户一个账号,同一个账号在服务器里生成一个文件夹,一个文件夹代表一个项目,默认一个用户只能创建3个项目。

string folderExistUser = Path.Combine(_webHostEnvironment.ContentRootPath, ".1YourProject", userName);
 if (Directory.Exists(folderExistUser))
 {
     var childrenFolder = new DirectoryInfo(folderExistUser);
     if (childrenFolder.GetDirectories()?.Count() > 2)
     {
         data.msg = "同一个用户一天内只能创建3个项目,请明天重试";
         return data;
     }
 }




 var output = "";
 try
 {
     string path = Path.Combine(_webHostEnvironment.ContentRootPath, "Resources");
     //根据系统使用不同的shell文件
     if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) path += "/win.bat";
     else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) path += "/linux.sh";
     else path += "/OSX.sh";
     var psi = new ProcessStartInfo(path, $"{userName} {projectName}") { RedirectStandardOutput = true };
     //启动
     var proc = Process.Start(psi);
     if (proc == null)
     {
         Console.WriteLine("Can not exec.");
     }
     else
     {
         Console.WriteLine("-------------Start read standard output--------------");
         //开始读取
         using (var sr = proc.StandardOutput)
         {
             while (!sr.EndOfStream)
             {
                 Console.WriteLine(sr.ReadLine());
             }
             if (!proc.HasExited)
             {
                 proc.Kill();
             }
         }
         Console.WriteLine("---------------Read end------------------");
         Console.WriteLine($"Exited Code :{proc.ExitCode}");
         Console.WriteLine($"项目初始化成功");


         output += "项目初始化成功";
     }
 }
 catch (Exception e)
 {
     _logger.LogError(e, e.Message);
     data.msg = $"创建失败:Error Message {e.Message}";
     return data;
 }

2$ 项目功能自定义配置

这里就是很核心,很复杂的一步了,用户在页面里勾选或者配置不同的功能,然后通过接口调用,将刚刚生成的项目文件,做不同的增删改查,或者是替换等各种技术,最终达到一个定制化的目的。(这里真是不看不知道,一看已经集成了这么多功能了,还有支付、公众号等多个模块还没写,这里还是建议如果您自己的开源项目中用到了Blog.Core项目相关功能,可以做个说明,我看有些项目直接COPY就开源成自己的了,毕竟开源不易)

想个性化定制一套Blog.Core项目?请看这里_第7张图片

具体的代码呢,前端很简单,后端很复杂,都是一个个的事件,不过我认为这个方法比较笨,所以就暂时贴出来了一部分,大概就是这样:

8a44a9900e4375dc3026bf2b24864594.png

每个功能就是一个插件,以后都插件化以后,就更简单了。
同时配置文件分开以后,每个功能就是一个json,直接替换掉某个配置文件,就能快速实现自定义配置的功能,比如数据连接对象JSON,直接将JSON提交到接口,然后生成单独的配置文件即可。

3$ 项目导出

这最后就是很简单了,直接将生成并优化后的项目文件生成出来即可,直接打开就能用,就能跑。

想个性化定制一套Blog.Core项目?请看这里_第8张图片

好啦,整体设计和开发大概就是这样的,因为还是开发设计中,所以目前还没有完整的部署,等以后方便的时候,我会开启一波内测,找几个小伙伴试试,然后再开放出来吧,同时也是更希望能有更多的小伙伴都参与进来,毕竟是能为国内.NET社区做贡献,也是一个很辛苦但是也很幸福的事情,元芳,你怎么看?

你可能感兴趣的:(java,微服务,开发语言,架构,云原生)