在我的应用程序中,我有静态助手“类”,它们为我执行大量逻辑,在这种特定情况下,该类是消息传递类,并且执行需要访问三个不同服务(工厂)的逻辑。

唯一需要引用此类的工厂是网络工厂,因为当接收到某个数据包时,我需要强制消息传递从服务器更新它的数据库。

这是我要执行的操作的一个示例:

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;
}]);

09-29 20:15