Внедрение зависимостей и инверсия управления в AngularJS

0

Я хорошо знаком с инъекцией зависимостей и инверсией управления на разных языках и как понятия. Тем не менее, я не могу придумать шаблон, подобный приведенному ниже примеру, используя лучшие методы AngularJS.

Я пытаюсь создать реестр объектов, в котором объекты могут быть добавлены и извлечены позже ключом.

function (angular) {
    'use strict';

    angular.module('sample')
        .service('ObjectRegistry', function () {
            var members = [];

            this.addMember = function(key, object) { 
                members[key] = object;
            }

            this.getMember = function(key) {
                return members[key] || {};
            }
        })
        .service('ObjectInstance', [ 'ObjectRegistry', function (ObjectRegistry) {

            this.doSomething = function () {};

            ObjectRegistry.addMember("my-key", this);
        }])
        .controller('MyController', [ 'ObjectRegistry', function (ObjectRegistry) {

    // Here I need to get ObjectRegistry populated with all services that register themselves in the registry, in this example, with ObjectInstance under the key "my-key"

        });

}(angular));

Проблема в том, что ObjectRegistry никогда не заселен, поскольку ObjectInstance никогда не инициализируется (и я не хочу делать с контроллера).

Какой был бы лучший подход для достижения этого в Angular? Я знаком, например, с контейнерами Symfony DI и передачами компилятора, которые позволяют реплицировать этот шаблон, но я не слишком уверен в том, как идти на него с помощью Angular DI.

  • 0
    Зачем вам второй реестр?
  • 0
    По многим причинам текущий вариант использования похож на реестр плагинов.
Теги:

1 ответ

0
Лучший ответ

Поэтому для потомков мне наконец удалось найти решение, которое соответствует моим потребностям, используя фазу конфигурации и поставщика услуг:

(function (angular) {
    'use strict';

    angular.module('sampleApp', [])
        .provider("ObjectRegistry", function () {
            var objects = {};

            return {
                bind: function (name, object) { objects[name] = object; },
                $get: function () {
                    return {
                        get: function (name) { return objects[name]; }
                    };
                }
            };
        });
}(angular));

И где бы еще в моем коде:

(function (angular) {
    'use strict';

    angular.module('sampleApp')
        .config(function (ObjectRegistryProvider) {
            ObjectRegistryProvider.bind("my-key", { });
        });
}(angular));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню