【问题标题】:Session injection not working for custom classes会话注入不适用于自定义类
【发布时间】:2013-12-14 18:15:49
【问题描述】:

依赖注入适用于路由和控制器,但我很难让它与自定义类一起使用。路由和控制器类的实例是由 Ember 自动实例化的,这可能就是问题所在。下面的例子应该能说明问题。我尝试在路由、控制器和自定义模型类中注入一个会话单例,它扩展了Ember.Object。路由和控制器一切正常,但不适用于自定义模型类。

问题可能是user 是使用App.User.create 创建的,因此它不是由应用程序的容器管理吗?在控制台中,我创建了一个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`
  }
});

【问题讨论】:

  • 单例和依赖注入不能很好地结合在一起。
  • 您能详细说明一下吗?上面的示例旨在使 App.User 类的每个实例都可以访问 session 单例。我不明白为什么这应该是一个问题。另一种方法是使用App.Session 单例,但我不想采用这种方法,因为它被认为是一种不好的做法。
  • 单例本身被认为是一种不好的做法,因为它隐藏了依赖关系并且在你的代码中引入了全局状态和魔法。
  • 这完全是一种观点,他对会话的需求是正确使用单例的完美示例,也就是说我不建议将逻辑注入您的模型中
  • 我完全同意,我不打算将会话单例注入每个用户模型。通过上面的例子,我只是想说明问题。

标签: javascript ember.js dependency-injection


【解决方案1】:

您是正确的,这是因为您正在创建模型,而不是处理 DI 的容器。

【讨论】:

  • 除了手动注入依赖之外,还有其他解决方案吗?
  • 你能给我一个用户模型需要如何访问会话的例子吗,也许有一个很好的替代解决方案
  • 当然有另一种方法,但我的问题是,如果该类的实例不是由应用程序的容器创建的,如何将单例对象注入到自定义类中,这对于模型对象来说大多是正确的.我已经更新了我的问题以澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多