如何构建完全模块化的Web应用程序


34

在接下来的几个月中,我们将开始一个项目,我们将采用为客户端(v1)构建的系统,并从头开始对其进行重建。v2的目标是使其模块化,以便该特定客户端拥有自己使用的一组模块,然后另一个客户端可以完全使用另一组模块。这里的窍门是,公司A可能具有一系列结帐和用户模块,这些模块会更改系统的工作方式。公司B可能会遵循标准的结帐程序,但会自定义产品的浏览方式。

当您要从头开始构建一个要Core在所有客户端之间共享的应用程序,同时又要为要专门针对客户端修改的内容保持灵活性时,应用程序体系结构有哪些好的方法?

我已经看过CodeIgniter的钩子,并且认为这不是一个好的解决方案,因为我们最终可能会有250个钩子,但仍然不够灵活。还有哪些其他解决方案?理想情况下,我们不需要在沙子上画一条线。

Answers:


26

为了实现高度组织化和解耦的模块化,您可以遵循Hierarchical MVC体系结构模式,有时也称为演示,抽象,控制(尽管它们并非完全相同)。KohanaAlloyFluencyFuelPHP原生支持HMVC *Sam de Freyssinet在“ 使用HMVC缩放Web应用程序优化HMVC Web应用程序的性能”中讨论了Kohana的HMVC方法。

不幸的是CodeIgniter本身不支持HMVC。我已经建立了自己的库以在CodeIgniter上提供某种HMVC支持,这是从wiredesignz的codeigniter-modular-extensions-hmvc中获得的启发。nettus + 上的HMVC文章非常不错,介绍了CodeIgniter和wiredesignz的扩展。以下图像和引用来自该教程:

在此处输入图片说明

每个三合会彼此独立运行。一个三合会可以通过其控制器请求访问另一个三合会。如果需要,这两点都允许将应用程序分布在多个位置。此外,MVC三元组的分层允许进行更深入的开发和更可靠的应用程序。这带来了几个优势,这使我们进入了下一个观点。

最后,即使您采用HMVC架构,使用钩子的方法也是正确的,根据您的实现和所需的自动化程度,仍然需要使用钩子解决一些问题。 。例如,钩子的一种好用法是pre_controller确保所有已安装模块的依赖项都存在的钩子。

*可能还有其他我不认识的人。


1
ASP.NET MVC是否对此提供支持?
罗伯特·哈维,

@RobertHarvey我不知道...
yannis

@Robert Harvey对我来说,这似乎更多是一种模式,而不是框架。也许我缺少了一些东西,但是我看不到为什么我不能通过ASP.NET MVC中的继承来做到这一点。
杰里米

3
@Jeremy:在视图中变得棘手,特别是如果您想重用部分视图。它看起来很有趣,但是我发现很难在螺母和螺栓级别上进行可视化。
罗伯特·哈维,

在上图中,看起来高层视图是由位于层次结构中较低位置的较小视图组成的。RenderAction()
罗伯特·哈维

5

我不是PHP的人,但是在Java脚本方面,如果您要拥有尽可能独立的模块,那么有几种系统可以使用该模块,例如RequireJS,它们都具有Java脚本声明依赖于其他模块的模块,并且框架确保在需要时加载它们。

那里的各种框架在如何声明依赖关系,在服务器上作为构建步骤,页面加载或根据请求动态完成多少依赖关系处理以及您必须改变多少编写Java-代码的方式方面有所不同。脚本。

如果您的服务器端框架正在处理此问题或为您生成Java脚本,那么这些框架的适用范围不大(或根本不适用),但是您可能希望Java脚本独立于服务器端框架。

如果您没有太多的Java脚本,但想要一些模块化,则始终可以使用匿名自调用函数来处理依赖关系,方法是先对具有依赖关系的脚本标签进行排序,然后通过在单个对象中进行注册来相互引用全局名称空间。至少这使它们几乎模块化,并且无需花费太多实施成本。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.