管理Web应用程序中的全局所需服务

时间:2014-11-06 09:50:21

标签: javascript design-patterns architecture module commonjs

我很难找到一个关于如何公开服务实例的满意解决方案,这些服务实例的方法需要通过我的应用程序的多个部分进行访问。

情况

首先,通过'服务',我的意思是一个包含属性和功能的函数的实例。通过API公开的方法。

考虑一个REST服务,其目的是提供访问服务器上的REST点的便捷方法。我会对该服务做出以下假设:

  • 它必须在整个应用程序中可用。随着应用程序的增长,可能会有新的组件需要访问。

  • 不需要此服务的多个实例。我们可以认为它是一个单身人士。

我的解决方案

我可以想到两种可能的解决方案:

连接脚本&利用全球对象

我可以将所有脚本文件(例如rest.service.jsapp.js)合并到一个文件中,并在全局对象上创建一个对象属性(如App)。 然后,我可以将服务实例附加到此对象。这允许我在应用程序的任何地方做这样的事情:

App.restService.get()

但是,即使我将每个服务包装在IIFE中,我仍然需要在window上添加一些变量以便检索实例。

使用commonJS / AMD模块

我可以使用require.js / browserify

require()来自世界各地的服务实例

问题

现在我很头疼,因为一方面,人们告诉我污染全球物体的是bad practice。单身人士are bad练习also

另一方面,我们为'uglify'脚本付出了很多努力,每个保存的字节都被视为增强。使用browserify会导致在多个文件中注入相同的脚本(但我使用的是Web组件,因此我有很多独立的脚本)。没有提到我不知道如何使用browserify提供状态安全服务。


那我该怎么办呢?

我应该如何公开可能会或可能不会多次实例化的标准服务?我该如何实施国家安全的?

2 个答案:

答案 0 :(得分:1)

只是一个起点(但是评论时间太长)我真的很喜欢AngularJs使用的策略,你总是在容器中实例化服务 - 每次你实例化某些东西时你还要指定应该注入哪些模块:

angular.module('myApp.services', []); // the second argument are the dependencies (an empty array

在任何时候,您都可以检索模块并添加功能:

var services = angular.module('myApp.services');
services.factory('yourServiceName', //
     ['other', 'service', 'dependencies'],
     function(other, service, dependencies){
         other.doStuff();
         service.doStuff();
         dependencies.doStuff();
         [..]
     });

然后,您可以将模块注入其他模块

var myApp = angular.module('na', ['yourServiceName'])

在角度,应用程序由框架本身实例化 - 但我想你可以为你的应用程序开发一个入口点,以便你可以使用你的服务。

..遗憾的是,我不知道这个模式是如何实现的 - 可能所有模块都存储在应用程序的实例中,因此全局命名空间不会受到污染。

答案 1 :(得分:1)

这个问题也让我很困惑,我认为我可以弄清楚两点: 1)全球每个服务都必须有一个入口点,否则无法在任何地方获得你需要的服务。在全球范围内添加很多东西并不好,但我认为服务参考是应得的。 2)配置除初始化以外的服务对象,例如,它们只能是一个具有不同配置的ajax服务对象来做不同的事情。有对象,所以它们可以合并和扩展。

这是一个有趣的话题,我希望看到更多的意见,不仅仅是服务管理,还有模板,对象,文件等其他资源。