我很难找到一个统计解决方案,了解如何公开其方法需要通过我的应用程序的多个部分访问的服务实例。
情况
首先,“服务”是指包含通过 API 公开的属性和方法的函数实例。
考虑一个 REST 服务,其目的是提供方便的方法来访问服务器上的 REST 点。我会对该服务做出以下假设:
它必须在整个应用程序中可用。随着应用的增长,很可能会有新的组件需要访问。
不需要此服务的多个实例。我们可以认为它是一个单例。
我的解决方案
我可以想到 2 种可能的解决方案:
连接脚本并使用全局对象
我可以将我所有的脚本文件(例如 rest.service.js
、app.js
)合并到一个文件中,并在全局对象上创建一个对象属性(像 App
)。
然后,我可以将服务实例附加到该对象。这让我可以在应用程序的任何地方做这样的事情:
App.restService.get()
但是,即使我将每个服务包装在一个 IIFE 中,我仍然必须在 window
上添加一些变量以检索实例。
使用 commonJS/AMD 模块
我可以使用 require.js/browserify 从任何地方require()
我的服务实例
问题
现在我很头疼,因为一方面,人们告诉我污染全局对象是 bad practice .单例are bad实践also .
另一方面,我们付出了很多努力来“丑化”脚本,保存的每个字节都被认为是一种增强。但是,使用 browserify 会导致在多个文件中注入(inject)相同的脚本(我使用的是网络组件,因此我有很多独立的脚本)。更不用说我不知道如何使用 browserify 提供状态安全的服务。
那么我该如何解决这个问题呢?
我应该如何公开可能会或可能不会多次实例化的标准服务?我应该如何实现状态安全的?
最佳答案
只是一个起点(但太长无法发表评论)我真的很喜欢 AngularJs 使用的策略,您总是在容器中实例化服务 - 每次实例化某些东西时,您还指定应将哪些模块注入(inject)其中:
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();
[..]
});
然后您可以将您的模块注入(inject)其他模块
var myApp = angular.module('na', ['yourServiceName'])
在 Angular 中,应用程序由框架本身实例化 - 但我想您可以为您的应用程序开发一个入口点,以便您可以使用您的服务。
..不幸的是,我不知道这个模式是如何实现的——可能所有的模块都存储在应用程序的一个实例中,所以全局命名空间没有被污染。
关于javascript - 管理 Web 应用程序中全局需要的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26776265/