Jie*_*eng 41 architecture frameworks design-patterns web-applications
我正在努力学习开发一个Web应用程序(最好是NodeJS/MongoDB,虽然之前我使用过PHP和Python),它是高度可扩展的,并且可以通过插件进行自定义以启用禁用功能.
一种可能的选择是使用带有插件和插件的钩子的Wordpress来挂钩,但是它缺乏适当的视图和逻辑代码分离.这仍然是学习的一种选择.还有其他选择吗?
你有任何代码片段或我可以学习的示例应用程序吗?语言或框架并不是那么重要,我可能会粗略地弄清楚背后的概念
Mar*_*mer 74
一个好的插件架构很难从头开始实现,但提供了自己的奖励.它通过本地化复杂性使软件变得灵活且易于维护.它需要的最重要的技能是能够编写松散耦合的代码.这需要非常牢固地掌握多态性,得墨忒耳定律和相关的好莱坞原则.
我建议你最初熟悉那些,然后是以下设计模式,这将显着减少困难:
一旦掌握了这些,就可以研究一些现有的Plugin Framework实现和架构,看看它们是如何被使用的.Apache在Struts,Geronimo自定义服务器程序集和Tomcat JNDI资源中有几个; 还有Eclipse插件框架.
我们没有这样的插件架构,但我会解释我们如何保持客户端代码松散耦合,也许它会给你一些想法.
我们正在使用asp.net.我们提供了一个main.aspx页面,其中首先包含一个中介javascript文件.它定义了一个全局对象 - 称之为中介 - 这是我们定义的唯一全局对象.
中介者使用发布和订阅消息公开一个简单的接口:
mediator.subscribe(messageName, callback);
mediator.publish(messageName);
Run Code Online (Sandbox Code Playgroud)
在mediator.js文件之后,主页面包含许多其他javaScript文件,每个文件都包含一个立即函数,该函数向中介者注册它的功能.更多关于这个模式可以发现在这里,或看到我的前一个问题在这里.
您可以遵循类似的方法 - 定义单个全局对象(比如pluginFramework),它为插件提供了一个注册其功能的接口.当您构建html页面以交付给客户端时,首先包含pluginFramework文件,然后动态地包含所需的JavaScript插件文件,这些文件可能取决于用户或设备(例如,如果设备启用触摸,则为不同的插件?).这些插件文件会通过立即函数将其功能添加到pluginFramework中.
以下是如何允许插件向UI中的菜单添加功能的示例:
pluginFramework.js:
var pluginFramework = (function() {
var menuItems = [];
function addMenuItemPrivate(itemName, callback) {
// e.g. add itemName and callback to menuItems
}
return {
addMenuItem: addMenuItemPrivate;
}
})());
Run Code Online (Sandbox Code Playgroud)
photoPlugin.js:
(function() {
function addPhoto() {
//...
}
pluginFramework.addMenuItem('add photo', addPhoto)
})());
Run Code Online (Sandbox Code Playgroud)
希望这在某种程度上有所帮助!
Your comment suggests that what you're building is a multi-tenant architecture.
This is a complex requirement - and one that's usually quite hard to retro-fit; it largely depends on where you're starting from.
Firstly, you need to have a decently factored web application in the first place; if you're using an MVC framework, you've got a starting point.
Secondly, you need to decide where you're going to support extensions; for instace, can a client have a complete separate skin for their UI? If so, you need a skinning framework. Can clients change everything, or just plug in different components at key points (e.g. a custom payment provider, or a custom authentication scheme). It's a lot easier to support a limited set of extension points than designing a framework that allows anything to be extended.
Next, your data strategy; there a good article on multi tenancy on MSDN; it's geared at relational databases, but provides ideas you can apply to Mongo.
最后,您必须提出一个支持您需要的扩展点的组件架构。当您处理 Web 应用程序时,您需要能够修改模型、视图、控制器和持久性;最好的解决方案是使用 MVC 框架想要的工作方式,并将“对于租户 x,执行 y;对于租户 z,执行 w”逻辑放在控制器层中。尝试一下,让它适用于您需要的一些情况,然后找出其中的问题并修复它。
| 归档时间: |
|
| 查看次数: |
26981 次 |
| 最近记录: |