天天看点

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

作者:opendotnet

一、故事回顾

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

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

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

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

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

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

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

二、新功能设计初衷

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

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

三、定制化设计思路

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

1$ 初始化新项目

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

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

然后这里是用接口的形式,把项目生成到服务器里,(也很简单,就是调用了一个可执行文件),给每一个用户一个账号,同一个账号在服务器里生成一个文件夹,一个文件夹代表一个项目,默认一个用户只能创建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 == )              {              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项目?请看这里

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

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

每个功能就是一个插件,以后都插件化以后,就更简单了。

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

3$ 项目导出

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

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

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

继续阅读