Передать параметр в сервисный конструктор

Предположим, у меня есть сервис Angular 2:

@Injectable()
class Demo {
    constructor(private instanceSpecificString: string) {
    }
}

Обратите внимание, что его constructor принимает специфичный для экземпляра string. Под этим я подразумеваю, что я хочу создавать этот сервис несколько раз, и каждый раз, когда он создается, я хочу передать ему другой string в зависимости от контекста, в котором создается сервис.

Как мне это сделать?

Постскриптум string используется в качестве примера, но параметр может легко иметь тип number, boolean или даже какую-то конфигурацию object.

Ответы

Ответ 1

Значение, которое передается вашей службе, будет определяться инжектором, который создает его. Возможно, вы сможете сделать это в одном из определений ваших компонентов:

@Component({
    ...
    providers: [
        provide(string, {useValue: "someSpecificValue"})
    ]
})

Однако у этой проблемы есть проблема, что вы определяете поставщика для токена строки, и это может привести к проблемам с ремонтопригодностью.

Вероятно, это лучший шаблон для определения некоторой конфигурации для вашей службы:

class DemoConfig {
    instanceSpecificString: string;
}

И затем вы можете создать экземпляр этого, чтобы перейти к вашей службе.

let config = { instanceSpecificString: "someSpecificValue" }

@Component({
    ...
    providers: [
        provide(DemoConfig, {useExisting: config})
    ]
})

Надеюсь, это полезно. Я сам не пробовал; сервисы, которые я использую в своем приложении, - это одиночные. Вот ссылка, которую я использовал:

https://angular.io/docs/ts/latest/api/core/index/provide-function.html

Ответ 2

Поскольку служба объявлена инъекционной (аннотация @Injectable()), она является одноэлементной. Вместо этого просто удалите аннотацию в верхней части службы, чтобы снять это ограничение.

Это не обязательно лучший метод, но он будет работать и компилироваться с включенным AOT.

Пример:

Изменить эту услугу:

@Injectable()
export class BaseSocket extends Socket {   
  protected constructor(
    private baseConfig:SocketIoConfig
    ...   
  ) {
    super();   
  } 
}

В это:

export class BaseSocket extends Socket {
  protected constructor(
    private baseConfig:SocketIoConfig
    ...
  ) {
     super();
  }
}