У меня возникли проблемы с внедрением зависимостей для моего AuthorizerService. Очевидно, что dep-inj не будет готов до тех пор, пока Аурелия не «запустится», но я не знал, как получить к нему доступ.
основной.js:
aurelia.container.registerInstance(HttpClient, http.c());
// set your interceptors to take cookie data and put into header
return aurelia.start().then(() => {
let Authorizer = new AuthorizerService();
aurelia.container.registerInstance(AuthorizerService, Authorization);
console.info('Current State: %o', Authorizer.auth);
Authorizer.checkCookieAndPingServer().then(() => { console.info('Current State: %o', Authorizer.auth); aurelia.setRoot(PLATFORM.moduleName('app')); }, () => { aurelia.setRoot(PLATFORM.moduleName('login-redirect')); });
});
Теперь проблема в том, что если я делаю "new AuthorizerService()", то "this.http.fetch()" недоступен в AuthorizerService.js.
Я хотел передать "http.c()" (который доставляет экземпляр HttpClient) в качестве параметра внутри:
checkCookieAndPingServer(http.c())
или есть другой способ?
Могу ли я удалить «new AuthorizerService()» и просто сделать (я это придумал):
aurelia.container.getInstance(AuthorizerService);
Каким-то образом ЗАСТАВИТЬ это сделать внедрение зависимостей и получить «зарегистрированный экземпляр» «http.c ()»?
Я не могу просто проверить куки. Мне нужно пропинговать сервер для обеспечения безопасности, и сервер установит файл cookie.
Я думаю, что это неправильно, потому что мне нужен глобальный параметр, который по умолчанию равен false, затем он выполняет запрос к внутреннему серверу и соответственно устанавливает Root. Возможно, только бэкэнд запроса на «странице входа»? Хорошо, но тогда мне нужно будет сделать "setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);" внутри модуля входа. Но когда я устанавливаю Root (backtoApp), то все начинается сначала.
Другими словами, когда setRoot(login); затем установитьRoot(backToApp); <-- тогда экземпляр AuthorizerService не имеет надлежащего набора данных (например, loggedIn=true).
Обновлено: Возможно, лучшее решение:
основной.js:
return aurelia.start().then(() => {
let Authorizer = aurelia.container.get(AuthorizerService);
let root = Authorizer.isAuthenticated() ? PLATFORM.moduleName('app') : PLATFORM.moduleName('login');
console.info('Current State: %o', Authorizer.auth);
aurelia.setRoot(root);
});
Authorizer.js
constructor(http) {
this.http = http;
this.auth = {
isAuthenticated: false,
user: {}
}
}
«this.auth» больше не является статичным. Больше не "static auth = {isAuthenticated: false}", который был примером кода, который я нашел.
Итак, теперь «auth» устанавливается внутри модуля «login». Но это означает, что модуль «логин» отображается каждый раз, когда приложение ненадолго загружается, прежде чем его перенаправят обратно в «setRoot (backToApp)».





Если класс, который вы хотите получить, основан исключительно на классах обслуживания и не имеет зависимостей от некоторых подключаемых модулей Aurelia, ему не нужно ждать, пока Aurelia начнет безопасно вызывать контейнер.
Для вашего примера: aurelia.container.getInstance(AuthorizerService); Это может быть aurelia.container.get(AuthorizerService);
И вы не должны использовать new AuthorizerService(), как вы заметили в своем вопросе.
Да, похоже, теперь все работает с «Обновлено: лучшее решение», которое я написал выше. Это кажется лучшим способом не сломать инъекцию зависимостей.