Я хорошо знаком с инъекцией зависимостей и инверсией управления на разных языках и как понятия. Тем не менее, я не могу придумать шаблон, подобный приведенному ниже примеру, используя лучшие методы 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.
Поэтому для потомков мне наконец удалось найти решение, которое соответствует моим потребностям, используя фазу конфигурации и поставщика услуг:
(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));