其他的方式来使用服务

问题描述 投票:0回答:1

我想一个部件的构造后,加载相应的服务。

我知道,在一个组件来使用服务的方法是将其调用构造函数。不过,我想能够根据,从我的组件数据加载这样或那样的服务。为了能够以后调用相应的服务。

对话的组件的示例粗糙

_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(“消息”)的方法。如果你能告诉我如何进行,我找不到它。我所找到的服务文件告诉我在构造函数中进行注册。感谢您百忙之中阅读我的问题的时候

angular typescript service
1个回答
1
投票

您可以使用工厂模式的形式GOF的设计模式,以做到这一点创建和接口

export interface IMessage{
   send();
}

然后在smsserviceemailservice

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)
     }

Example here

© www.soinside.com 2019 - 2024. All rights reserved.