我很难找到一个关于如何公开服务实例的满意解决方案,这些服务实例的方法需要通过我的应用程序的多个部分进行访问。
首先,通过'服务',我的意思是一个包含属性和功能的函数的实例。通过API公开的方法。
考虑一个REST服务,其目的是提供访问服务器上的REST点的便捷方法。我会对该服务做出以下假设:
它必须在整个应用程序中可用。随着应用程序的增长,可能会有新的组件需要访问。
不需要此服务的多个实例。我们可以认为它是一个单身人士。
我可以想到两种可能的解决方案:
我可以将所有脚本文件(例如rest.service.js
,app.js
)合并到一个文件中,并在全局对象上创建一个对象属性(如App
)。
然后,我可以将服务实例附加到此对象。这允许我在应用程序的任何地方做这样的事情:
App.restService.get()
但是,即使我将每个服务包装在IIFE中,我仍然需要在window
上添加一些变量以便检索实例。
我可以使用require.js / browserify
require()
来自世界各地的服务实例
现在我很头疼,因为一方面,人们告诉我污染全球物体的是bad practice。单身人士are bad练习also。
另一方面,我们为'uglify'脚本付出了很多努力,每个保存的字节都被视为增强。使用browserify会导致在多个文件中注入相同的脚本(但我使用的是Web组件,因此我有很多独立的脚本)。没有提到我不知道如何使用browserify提供状态安全服务。
那我该怎么办呢?
我应该如何公开可能会或可能不会多次实例化的标准服务?我该如何实施国家安全的?
答案 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服务对象来做不同的事情。有对象,所以它们可以合并和扩展。
这是一个有趣的话题,我希望看到更多的意见,不仅仅是服务管理,还有模板,对象,文件等其他资源。