종속성 주입이 경로와 컨트롤러에서 제대로 작동하지만 사용자 지정 클래스에서 작동하는 데 문제가 있습니다. 경로 및 컨트롤러 클래스의 인스턴스는 Ember에 의해 자동으로 인스턴스화됩니다. Ember는 문제가있는 곳일 수 있습니다. 아래 예제는 문제를 설명합니다. 나는 경로, 컨트롤러, 그리고 Ember.Object
을 확장하는 커스텀 모델 클래스에 세션 싱글 톤을 주입하려고한다. 모든 것이 라우트와 컨트롤러에서 잘 작동하지만 사용자 정의 모델 클래스에서는 작동하지 않습니다.사용자 지정 클래스에 대해 세션 주입이 작동하지 않습니다.
App.User.create
을 사용하여 user
이 생성되어 응용 프로그램의 컨테이너에서 관리되지 않을 수 있습니까? 콘솔에서 App.IndexRoute
의 인스턴스를 만들었고 인스턴스에 세션을 주입하지 않았습니다. 나는 무엇을 여기에서 바라보고 있냐?
분명히하기 위해 Ember의 소스 코드에있는 다른 레지스터/주입 예제를 살펴 보았지만 Ember에서 종속성 주입의 주요 측면이 누락 된 것 같습니다.
업데이트 아래 예제는 모든 사용자 모델에 세션 싱글 톤으로 삽입하고 싶지 않으므로 문제를 설명하기위한 예일뿐입니다. 진짜 질문은 인스턴스가 응용 프로그램의 컨테이너에 의해 생성되지 않으면 인스턴스에 단일 객체를 삽입하는 방법입니다.
App = Ember.Application.create();
App.Session = Ember.Object.extend({
user: 'defaultUser'
});
App.User = Ember.Object.extend({
first: '',
last: ''
});
App.initializer({
name: 'session',
initialize: function(container, application) {
application.register('session:main', App.Session);
application.register('model:user', App.User, { singleton: false });
application.inject('route', 'session', 'session:main');
application.inject('controller', 'session', 'session:main');
application.inject('model:user', 'session', 'session:main');
}
});
App.IndexRoute = Ember.Route.extend({
setupController: function(controller, model) {
this._super(controller, model);
var user = App.User.create({
first: 'bart',
last: 'jacobs'
});
console.log(this.get('session')); // returns `session` singleton
console.log(controller.get('session')); // returns `session` singleton
console.log(user.get('session')); // returns `undefined`
}
});
싱글 톤과 종속성 삽입은 잘 어울리지 않습니다. –
이것에 대해 자세히 설명해 주시겠습니까? 위 예제는'Session' 싱글 톤을'App.User' 클래스의 모든 인스턴스에 접근 가능하게 만드는 것을 목표로합니다. 왜 이것이 문제가되어야하는지 나는 모르겠다. 대안은'App.Session' 싱글 톤을 갖는 것이지만 나쁜 접근 방식으로 간주되기 때문에 접근하지 않는 것을 선호합니다. –
싱글 톤 자체는 의존성을 숨기므로 나쁜 습관으로 간주됩니다 * 및 * 코드에 전역 상태 및 마법을 도입합니다. –