Вложенные зависимости в методе "запуска" модуля в Angularjs

Я пытаюсь понять, как мне работать с Angularjs. Это выглядит как хорошая структура, но я застрял с небольшой проблемой с DI...

Как я могу впрыскивать зависимости в методе "run" модуля? Я имею в виду, что я могу это сделать, но он работает только в том случае, если у меня есть service/factory/value с тем же именем, что и имя параметра run. Я создаю простое приложение, которое иллюстрирует, что я имею в виду:

var CONFIGURATION = "Configuration"; //I would like to have App.Configuration
var LOG_SERVICE = "LogService"; //I would like to have App.Services.LogService
var LOGIN_CONTROLLER = "LoginController";

var App = {};
App.Services = {};
App.Controllers = {};

App = angular.extend(App, angular.module("App", [])
            .run(function ($rootScope, $location, Configuration, LogService) {

                //How to force LogService to be the logger in params?
                //not var = logger = LogService :)
                LogService.log("app run");
            }));
//App.$inject = [CONFIGURATION, LOG_SERVICE]; /* NOT WORKS */

App.Services.LogService = function (config) {
    this.log = function (message) { 
                   config.hasConsole ? console.log(message) : alert(message); 
               };
};
App.Services.LogService.$inject = [CONFIGURATION];
App.service(LOG_SERVICE, App.Services.LogService);

App.Controllers.LoginController = function (config, logger) {
    logger.log("Controller constructed");
}
//The line below, required only because of problem described
App.Controllers.LoginController.$inject = [CONFIGURATION, LOG_SERVICE];

App.factory(CONFIGURATION, function () { return { hasConsole: console && console.log }; });  

Зачем мне это нужно, вы можете спросить:) Но на мой взгляд, прежде всего, чтобы иметь значимые пространства имен для организации кода. Это также минимизирует столкновение имен, а в последнем случае при мини-JS все ломается, поскольку оно переименовано в более короткие имена.

Ответ 1

Я думаю, что причина

App.$inject = [CONFIGURATION, LOG_SERVICE];

не работает, потому что у вас есть еще 2 параметра $rootScope и $location, которые нужно ввести в $inject. Поэтому это должно быть:

App.$inject = ["$rootScope", "$location", CONFIGURATION, LOG_SERVICE];

Другой способ, которым вы можете добавить свою службу, - использовать эту версию:

app.run(["$rootScope", "$location", CONFIGURATION, LOG_SERVICE, 
         function ($rootScope, $location, Configuration, LogService) {

}] );