模块化的个人浅见(二)

1618 0

上一篇文章已经阐明了我认为的模块的概念。并且决定了我的项目架构为一套完整的框架(公共组件)搭配模块约定。那么现在进一步明确,模块化的项目架构具体应该怎样设计。

之前失败的案例原因是我认为框架是公共组件的集合,与模块不相干,无需受到模块约定的约束。但是,我忽视了其实模块也是多个组件通过特定逻辑关联起来的组件集合,所谓的模块约定几乎可以等同视为组件约定同一个项目下的所有组件应该遵循相同设计原则,遵守相同约定。不管它是框架下的公共组件亦或是模块下的特异化组件。

既然想搭建一套敏捷开发的框架,那么你所要是适配的业务逻辑是繁复多样的。也就意味着模块这个概念现阶段对我而言是抽象的,我的所有约定都应该不包含特定的业务逻辑。是对编程习惯、项目结构等开发角度人为操作的约定。即开发人员想要完整的使用此框架,那么他所编写的模块代码需要按照约定列表进行规范方可正常使用,否则无法完整使用框架内容。

模块约定:

  • 模块应遵循统一的设计原则。
  • 项目结构应遵循统一风格。
  • 应用服务必须采用Service结尾。
  • 应用服务的第一个接口类型就是所需的应用服务接口。
  • 模块名称必须以项目名.Mod.模块名进行命名。
  • 其它微软已经做出约定的约定。

这些约定都是基于之前项目的经验积累所做出的判断,对于目前阶段来说,框架不一定要都实现,此约定也不一定完整,可以先进入设计阶段,在设计过程中可能会发现更多的约定亦或是简化已有的约定。对于约定,首先应考虑设计原则。这个不止是模块化开发,我认为良好的项目设计都必须遵循设计原则(单一职责、开闭、里氏替换、迪米特、接口隔离、依赖倒置)。其次是语言及基础框架的默认约定。再然后就是我们所做的模块约定。至于配置文件结构及项目结构,这牵扯到代码风格统一及代码规范。

一开始我是每个模块为了实现相同约定都写了相近或相同的代码,后来参考老李的MKH项目的时候,我突然猛的发现,其实,模块化的约定所形成的组件何尝又不是一个公共组件呢,而且是一个非常重要的公共组件。至此,框架的第一个公共组件出现了,就是Module。给开发人员留下了最少的干预项,他们的模块只要能够引用Module并实现某些抽象,那么他就只需要关注公共组件所无法控制的约定即可,如项目结构。

设计好了Module组件对于整个框架的搭建有很重要的意义,它就相当于一个模板,当它完成后,其它组件的配置文件结构、项目结构也就出现了,模块的约定也明确了。敏捷开发框架,我所看重的一点是多端适配,即要覆盖客户端Client、服务器端Web、供第三方使用的数据接口Api。同时,出于设计的角度考虑,我认为三端应该有共同的抽象Abstraction及实现Core。但是实际上呢,市面上不管是开源的还是付费的敏捷开发框架也好,开箱即用的项目也罢,基本上都向Web靠拢了。我也不知道这个趋势是好还是坏,是对还是错,我个人的看法也并不能影响任何事物。我考虑过很久,当初还没写的时候觉得自己动手写框架的时候一定要兼容多端,实际做起来,千难万难。甚至都不知道如何下手。不管怎么样,接口还是保留吧。说不定哪天哪位大神就能实现了呢。对于这几端的定义,虽然名词相同,但是可能每个人在自己项目中都有不同的理解,对我而言,我个人的理解是这样的。Abstraction是公共抽象,即面向用户的抽象,如果我们提供的核心实现Core无法满足用户的需求,用户可以基于公共抽象重写实现以满足自己的需求。Core是核心实现,即框架本身对某个组件所提供的实现,它基本上可以覆盖大部分的通用需求。Web是自身项目的服务端,之所以命名上没有明确表示出是Web Api还是Web Services亦或是Web Mvc,是因为在我所使用的当前版本.NET 5C# 9.0,微软提供了很方便的切换方式。所以无需像以前一样特别注明你所使用的方式。Client是客户端,这里的客户端定义为狭义上的WindowsLinuxMacOS上的应用程序。即C/S架构下的C。Api是第三方使用的数据接口,这其实处于两个角度考虑,一个是系统安全性、一个是系统稳定性。通常与第三方的数据交互,我不希望它能直接调用我系统内部的接口,同时由于我的系统可能正在进行迭代,我也需要一个稳定的接口供第三方使用。注意:请不要将此Api理解成自身项目的Web Api架构。

基于我之前的认知及上文所总结的Module组件目前的项目结构应该是这样的:

  • 抽象(必须)
  • 核心实现(必须)
  • 其它实现(可选)
  • 客户端实现(可选)
  • 服务器端实现(可选)
  • 第三方数据接口实现(可选)

基于公共组件的项目结构以及上文所描述的项目含义,我认为用户所写的模块的项目结构应该是这样的:

  • 核心实现(必须)
  • 其它实现(可选)
  • 客户端实现(可选)
  • 服务器端实现(可选)
  • 第三方数据接口实现(可选)

最后,本文又进一步阐明了我所理想化的模块化的约定及框架第一个组件的形成。以及对组件、模块的项目结构的具体说明。

由于个人能力浅薄,认知有限。如本文中您认为有错误,欢迎指正及交流。