我正在尝试在Ionic 3项目中实现一些自定义类,以帮助以适当的OOP方式处理数据。但是,我认为我想要实现的实际上是针对Angular和Ionic设计模式的反模式。
对于每个用户,我想创建一个用户对象。我有一个名为provider
的提供程序,它执行一些http调用。每个用户对象都可以使用进行provider
的http调用的方法。
如果我像这样通过构造函数传递Provider
,此方法就可以正常工作:
export class User {
//...various user attributes....
constructor(payload, public provider: Provider){
this.provider.doSomethingHttp(payload).subscribe(val => {
// do something with response
})
}
}
如果我做这样的事情不起作用:
export class User {
//...various user attributes....
public provider: Provider;
constructor(payload){
this.provider.doSomethingHttp(payload).subscribe(val => {
// do something with response
})
}
}
提供者现在为undefined
。
为什么会这样?提供程序必须通过构造函数传递吗?
此外,如果我在某个地方实例化了User
的新类,我将不得不为提供者传递参数,这也不起作用。
let user = new User(payload, this.provider)
显然,似乎有一些更好的方法可以解决此问题。也许最好不要有一堆对象进行自己的http调用。
答案 0 :(得分:1)
提供程序是由依赖注入创建的,要拥有它们的实例,您必须将它们添加到组件的构造函数中,如第一个示例一样,并将其添加到应用程序模块提供程序中。
除了组件和提供程序之外,我从未见过其他类中的提供程序,我认为在创建用户的地方(我想是组件或提供程序),您可以在构造函数中添加提供程序,如果需要时,将其传递给User
构造函数。
其他选择是从User class
中删除提供程序,创建一个新的提供程序(将其称为 UserPrivider ),该提供程序将在构造函数中添加第一个provider
,并在此新的 UserProvider 中实现一个创建用户的方法,并在创建后调用第一个提供者,以便每次需要创建User时,都注入UserProvider并调用这种方法。
答案 1 :(得分:0)
“为什么会这样?”
提供者是undefined
,因为它从未分配。
export class User {
constructor(payload, public provider: Provider) { }
}
是
的简写export class User {
public provider: Provider;
constructor(payload, provider: Provider) {
this.provider = provider;
}
}
“必须通过构造函数传递提供程序吗?”
那是一种方式,但是this.provider =
必须至少以某种方式发生。
“显然,似乎有一些更好的方法可以解决此问题。也许最好不要让一堆漂浮在其中的对象进行自己的http调用。”
就像@Octavio Garbarino所说的那样,通常您会拥有一个服务,该服务进行http调用并以User
方法返回getUser(payload): User
实例。