Использовать реализацию провайдера внутри другой реализации того же провайдера в Angular - PullRequest
0 голосов
/ 26 июня 2019

Я хочу внедрить реализацию провайдера в другую реализацию того же провайдера в Angular, но я не смог этого добиться.Идея состоит в том, что я могу специализировать вторую реализацию на данных из первой реализации. Как я читал в угловой документации, невозможно использовать вторую реализацию того же провайдера, но я хочу знать, достиг ли это кто-то каким-либо образом

Спасибо

export abstract class Provider {
    abstract someMethod();
}

export class implProviderOne implements Provider{
    someMethod(){
    }
}

export class implProviderTwo implements Provider{
    constructor(private provider: Provider) {} // I DI injects implProviderOne in this implementation
    someMethod(){
    }
}

//This is what I try

//Main Module
//main.module.ts
@NgModule({
    ...
    imports: [InnerModule],
    providers:[
        { provide: Provider, useClass:implProviderOne}
    ], 
    ...
})
export class MainModule {}

//Inner Module
//inner.module.ts
@NgModule({
    ...
    {provide: Provider, useClass:implProviderTwo } // What I can do to achieve this?
    ...
})
export class InnerModule {}

1 Ответ

0 голосов
/ 26 июня 2019

Прежде чем вы захотите сменить провайдера, вам нужно объявить его.

@Injectable()
export class ProviderService {
    public someMethod(){
       console.log('My injected provider')
    }
}

@Injectable()
export class ProviderTwoService {
    public someMethod(){ console.log("My swiched provider") }
}

@Injectable()
export class implProviderOneService {
    constructor(private provider: ProviderService) {} <<< this way u inject remember it need to have scope like private, public, protected

    someFunction() {
       this.provider.someMethod() <<< this way u use injected service
     }
}

//This is what I try

//Main Module
//main.module.ts
@NgModule({
    ...
    providers:[
         ProviderService,
        { provide: ProviderService, useClass:ProviderTwoService}
    ], 
    ...
})

{ provide: ProviderService, useClass: ProviderTwoService } Это для изменения ProviderService на ProviderTwoService, поэтому, где бы вы ни вводили инъекцию и использовали первого поставщика, будет вводиться второй.

...