【发布时间】: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