Другой способ использования услуг - PullRequest
0 голосов
/ 05 февраля 2019

Я хотел бы загрузить соответствующий сервис после конструктора компонента.

Я знаю, что способ использовать сервис в компоненте - вызвать его в конструкторе.Но я хотел бы иметь возможность загружать ту или иную службу в соответствии с данными из моего компонента.Чтобы иметь возможность вызывать соответствующую службу позже.

Примерный пример компонента диалога

_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 ("message");Он будет использовать метод SmsService.send ("message").Если вы можете сказать мне, как поступить, я не могу найти это.Все документы, которые я нахожу об услугах, говорят мне зарегистрировать это в конструкторе.Спасибо, что нашли время, чтобы прочитать мою проблему

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете использовать шаблоны шаблонов форм GOF Factory, чтобы создавать и взаимодействовать

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

Пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...