重用无循环依赖的服务

时间:2017-09-06 16:35:26

标签: javascript angularjs dependency-injection angular-services

我有一项服务全局存储我的应用程序中使用的所有数据。

GlobalDataService(GDS)

angular
        .module('app.core')
        .service('GlobalDataService', GlobalDataService);
    GlobalDataService.$inject = ['$http', 'LineStatusService'];
    function GlobalDataService($http, LineStatusService) {
        var gds = this;

        gds.data = {
            //all my data
        }

        gds.data.lines = LineStatusService.getLineStatus().then...
    }

一个简单的crud服务,用于处理我的数据状态。

StatusDataService(SDS)

angular
        .module('app.core')
        .service('LineStatusService', LineStatusService);
    LineStatusService.$inject = ['$http', 'GlobalDataService'];
    function LineStatusService($http, GlobalDataService) {
        var service = {
            getLineStatus: getLineStatus,
            saveLineStatus: saveLineStatus,
            ...
        };

        function saveLineStatus (line, status, user) {
            var data = {
                status: {
                    status_id: status.status_id,
                    status_desc: status.status_desc
                },
                updated_by: user
            }

            return $http.post('/api/euauto/v1/delivery-status/linestatus', data)
            .then(function successCallback(response) {
                GlobalDataService.data[id].status = status;
                return response.data;
            }).catch(function errorCallback(response) {

            });
        }

        return service;
    }

GDS必须在应用首次加载时请求所有状态,然后状态服务处理任何其他数据请求。

现在我知道你不能拥有循环依赖,因此我的计划是让我的控制器使用SDS处理保存和更新, ALSO 更新GDS。< / p>

潜在解决方案

angular
        .module('core')
        .controller('MyController', MyController);

    MyController.$inject = ['GlobalDataService', 'LineStatusService'];
    function MyController(GlobalDataService, LineStatusService) {
        function changeStatus(line, status, user) {
            //do a thing
            //and another
            LineStatusService.saveLineStatus(line, status, user);
            GlobalDataService.data.line[id] = status;
            GlobalDataService.updateAllOtherData();
            //etc...
        }
    }

问题

我的问题是,现在我想开发一个新控制器,其中包含完全相同的功能,我现在要记住将相同的代码和业务逻辑从我原来的控制器复制到重用两种服务。 此外,如果GDS不依赖于SDS,它将无法加载getLineStatus(),并且应用程序中的每个Controller都必须记住加载时的getLineStatus()。

理想情况下,所有逻辑和请求都应包含在一个地方,最好是我的SDS。我的GDS数据应该在整个应用程序中保持一致。

1 个答案:

答案 0 :(得分:4)

如果应用程序启动时应该使用数据初始化GlobalDataService,那么您可以在angular .module('app.core') .run(function(GlobalDataService, LineStatusService) { GlobalDataService.data.lines = LineStatusService.getLineStatus().then... }); 块而不是服务构造函数中初始化它。这样,GDS根本不需要注入其他服务。然后,其他数据服务可以注入GDS而不会出现循环依赖性问题。

{{1}}