在我的应用程序中,我有静态助手"类"为我执行大量逻辑,在这种特定情况下,此类是消息传递类,并执行需要访问三个不同服务(工厂)的逻辑。
唯一需要引用此类的工厂是网络工厂,因为当收到某个数据包时,我需要强制消息传递从服务器更新它的数据库。
以下是我尝试做的一个例子:
angular.module('database', []).factory('$database', function() {
// SQLite implementation
return {
// ...
};
});
angular.module('networking', []).factory('$networking', ['$database', function($database) {
// Websocket implementation
if(packet.opcode == 8) {
Messaging.update(this, $database);
}
return {
// ...
};
}]);
Messaging = {
// Messaging implementation..
update: function(networking, database) {
if(networking === undefined) { ]
console.log("Networking is undefined.");
return;
}
if(database === undefined) {
console.log("Database is undefined.");
return;
}
// Messaging update implementation.
};
不幸的是,在尝试呼叫Networking is undefined.
时会显示Messaging.update(this, $database)
消息,如上所示。
注意:我不能简单地将$ networking实现注入$ scope并使用它,因为这是在"后端"处理的。该逻辑应完全独立于范围执行。只要服务器(Websocket实现)将数据包操作码8发送到客户端,无论范围如何,都应执行此代码。这种执行完全在后台完成,用户甚至不知道它发生了。
我也在适用的其他地方(来自范围)使用Messaging.update
,例如在MessagingController
用户发送消息时,我可以使用Message.update
来调用$networking
注入的file-cache, database, networking
服务。不幸的是,注射剂不是一种选择。
注意:创建Messaging作为服务实现会创建一个依赖循环,因为我目前有三个服务host
,而消息传递实现需要所有这三个服务的功能。当收到消息时,网络需要获取有关本地SQLite数据库中不可用的用户的信息。文件缓存用于在创建新线程时缓存用户头像图像,并且当然需要数据库来存储消息。
答案 0 :(得分:2)
这种模式怎么样
angular.module('networking', []).factory('$networking', ['$database', function($database) {
var net = {
....
};
// Websocket implementation
if(packet.opcode == 8) {
Messaging.update(net, $database);
}
return net;
}]);
答案 1 :(得分:0)
工厂方法未实例化(与服务相似),您返回的对象与您在应用程序的其他部分中引用的对象相同。所以你不能用这个'来引用它。你可以做这样的事情(虽然我不确定它是一个好习惯):
//inside your factory
var fac = { //your factory object
};
return fac;
现在你可以替换这个'与' fac'。
我要做的是将Messaging模块包装为服务。为了删除循环依赖项,您将创建另一个将包装所有这些服务的服务/工厂。我不确定具体如何,因为我不知道您的依赖图,但这就是我的工作。