我希望能够使用构造函数实例化模型,但仍然为该模型提供注入(inject)服务。
换句话说,我希望能够做这样的事情:
var book = new Book({ id: 5 }); // creates instance, sets id = 5
book.makeHttpCall(); // makes an API call with Angular's http service
为了实现此目的,我有一个“工厂”,它使用标准依赖项注入(inject)来获取 http
服务。这个工厂有一个方法,例如make()
创建模型的实例。然后,它获取对其注入(inject)的 http
服务的引用,并将其分配给模型内的变量。
在代码中,以书籍为例:
使用此设置的服务:
@Injectable()
export class LibraryService {
constructor(
private http: Http,
private bookFactory: BookFactory
) {}
getBook(): Observable<BookModel> {
return this.http.get('http://localhost:3000/book/1')
.map((res) => {
return this.bookFactory.make(res.json().data)
});
}
}
创建模型的工厂,并为它们提供http
服务:
@Injectable()
export class BookFactory {
constructor(public http: Http) {}
make(def): BookModel {
let book = new BookModel(def);
book.di = {
http: this.http
};
return book;
}
}
图书模型现在可以使用 this.di.http
中的 http
服务:
export class BookModel {
di: any;
constructor(private def: object) {}
makeHttpCall() {
this.di.http.get(...)
...
}
}
我所拥有的作品。但这看起来非常hacky。好像我正在做一些非常反对“Angular 做事方式”的事情。在 AngularJS (1.x) 中,我使用普通的 Angular 工厂完成了这一任务,一切都很好。但这似乎是我在 Angular 2 中见过的唯一方法。
问题:
- 这种策略是否会令人不悦?这不是“Angular 方式”吗?
- 有更好的方法来完成我想做的事情吗?我发现了一些东西,例如
providers.useFactory
和ReflectiveInjector
,但似乎都没有实现我所寻找的目标。
感谢任何帮助。
最佳答案
在我看来,你在 Angular 方面并没有做坏事,但在软件设计方面。看来你混合了责任。 Book 不应该是一个只保存书籍数据的类。执行 api 调用的类应该是某种从图书实例获取 id 或其他数据的存储库模式。另请查看 Solid 中的 s
关于javascript - Angular 2+ 使用 DI 和实例化模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710046/