我想一个部件的构造后,加载相应的服务。
我知道,在一个组件来使用服务的方法是将其调用构造函数。不过,我想能够根据,从我的组件数据加载这样或那样的服务。为了能够以后调用相应的服务。
对话的组件的示例粗糙
_currentSendingService; // a service
constructor(private _alert : AlertService)
{
this.foo();
}
foo() {
if (condition) {
this._currentSendingService = SmsService // not working idea of what i want
}
else {
this._currentSendingService = EmailService
}
}
sendMessage() {
this._currentSendingService.send(message)
}
一种方法做这件事是把所有的服务在构造函数和实例化一个变种。
constructor(private _alert : AlertService, private _smsService:SmsService, private _emailService:EmailService)
{
this.foo();
}
而在FOO这样做();
foo() {
if (condition) {
this._currentSendingService = this._smsService
}
else {
this._currentSendingService = this._emailService
}
}
sendMessage() {
this._currentSendingService.send(message)
}
但是,如果我用了很多的服务,是优化做这样呢? (想象一下,如果我有一个可用的20个服务,但其中只有一个是根据场景的使用),并用这种方式,每个服务的构造函数会触发,这是一个行为我可能不希望
例如:我们加载的成分,根据我们要使用的SmsService作为_currentSendingService它的数据,因为我们已经在会话消息的类型是只在SMS。所以,当我使用_currentSendingService.send(“信息”);它将使用SmsService.send(“消息”)的方法。如果你能告诉我如何进行,我找不到它。我所找到的服务文件告诉我在构造函数中进行注册。感谢您百忙之中阅读我的问题的时候
您可以使用工厂模式的形式GOF的设计模式,以做到这一点创建和接口
export interface IMessage{
send();
}
然后在smsservice
和emailservice
export class SMSService implements
{
send(){
//your implementation
}
}
同样应的电子邮件服务可以做到,那么创建messageservicefactory
export class MessageServiceFactory{
getInstance(yourcondition):IMessage{
if(condition){
return new SMSService();
}else{
return EmailSerivce();
}//you can also use switch case here
}
然后注入你messageserivcefactory到您的组件,并使用类似
_messageService:IMessage;
constructor(private _messageServiceFactory :MessageServiceFactory)
{
_messageService=__messageServiceFactory.getInstance(condition);
}
sendMessage() {
this._messageService.send(message)
}