2013-12-14 3 views
0

종속성 주입이 경로와 컨트롤러에서 제대로 작동하지만 사용자 지정 클래스에서 작동하는 데 문제가 있습니다. 경로 및 컨트롤러 클래스의 인스턴스는 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` 
    } 
}); 
+0

싱글 톤과 종속성 삽입은 잘 어울리지 않습니다. –

+0

이것에 대해 자세히 설명해 주시겠습니까? 위 예제는'Session' 싱글 톤을'App.User' 클래스의 모든 인스턴스에 접근 가능하게 만드는 것을 목표로합니다. 왜 이것이 문제가되어야하는지 나는 모르겠다. 대안은'App.Session' 싱글 톤을 갖는 것이지만 나쁜 접근 방식으로 간주되기 때문에 접근하지 않는 것을 선호합니다. –

+0

싱글 톤 자체는 의존성을 숨기므로 나쁜 습관으로 간주됩니다 * 및 * 코드에 전역 상태 및 마법을 도입합니다. –

답변

1

DI를 처리하는 컨테이너가 아니라 모델을 생성했기 때문입니다.

+0

수동으로 종속성을 주입하는 것 외에도이를위한 해결책이 있습니까? –

+0

사용자 모델이 세션에 액세스해야하는 방법에 대한 예를 들어 줄 수 있습니까? 좋은 대안 솔루션이있을 수 있습니다. – Kingpin2k

+0

확실한 대안 접근 방식이 있습니다.하지만 제 질문은 사용자 정의 클래스에 싱글 톤 객체를 삽입하는 방법입니다. 인스턴스 그 클래스의 애플리케이션 컨테이너에 의해 생성되는 것은 아니며 모델 객체의 경우 대부분 그렇습니다. 나는 이것을 명확히하기 위해 나의 질문을 업데이트했다. –

관련 문제