在我的应用程序中,我有静态助手“类”,它们为我执行大量逻辑,在这种特定情况下,该类是消息传递类,并且执行需要访问三个不同服务(工厂)的逻辑。
唯一需要引用此类的工厂是网络工厂,因为当接收到某个数据包时,我需要强制消息传递从服务器更新它的数据库。
这是我要执行的操作的一个示例:
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
,并且消息传递实现需要这三个服务的功能。收到消息后,需要网络来获取有关本地SQLite数据库中不可用的用户的信息。当创建新线程时,文件缓存用于缓存用户的头像图像,当然还需要数据库来存储消息。 最佳答案
这个模式怎么样
angular.module('networking', []).factory('$networking', ['$database', function($database) {
var net = {
....
};
// Websocket implementation
if(packet.opcode == 8) {
Messaging.update(net, $database);
}
return net;
}]);