/ / Używanie zarówno dostawcy, jak i tokenu wtryskowego w jonowym tworzy duplikat instancji - kątowe, jonowe-szkieletowe, zależne-wtryskowe, jonowe3, abstrakcyjne-fabryczne

Użycie zarówno dostawcy, jak i tokenu wtryskowego w jonowej tworzy zduplikowane wystąpienie - kątowe, jonowe-szkieletowe, zależne-wtryskowe, jonowe3, abstrakcyjne-fabryczne

Mam interfejs dla mojej usługi i token wtryskowy:

export const AUTH_PROVIDER_IT = new InjectionToken<AuthProvider>("auth")
export interface AuthProvider {
login(IAuthLoginData): Promise<void>
logout()
register(IAuthRegistrationData): Promise<void>
}

app.module.ts:

@NgModule({
...
providers: [
...
{provide: AUTH_PROVIDER_IT, useClass: CognitoAuthProvider},
]
})

i używam go na mojej stronie logowania:

export class LoginPage implements OnInit {

constructor(public navCtrl: NavController, ...
@Inject(AUTH_PROVIDER_IT) public auth: AuthProvider) {
}
...
}

Wszystko działa dobrze ....

Ale teraz mam usługę, która potrzebuje klasa betonu:

@Injectable()
export class CognitoProfileProvider implements ProfileProvider {
constructor(private cognitoAuth: CognitoAuthProvider) {

}
}

Więc robię to:

@NgModule({
...
providers: [
...
CognitoAuthProvider, <--- HERE
{provide: AUTH_PROVIDER_IT, useClass: CognitoAuthProvider},
{provide: PROFILE_PROVIDER_IT, useClass: CognitoProfileProvider} <-- AND HERE
]
})

Ale kiedy próbuję czytać CognitoAuthProvider w moim CognitoProfileProvider Rozumiem, że to nowa instancja ...

Dlaczego otrzymuję inną instancję dla tego samego dostawcy? Czy to oczekiwane zachowanie?

Uwaga: Testowałem wstrzykiwanie tylko konkretnego dostawcy i działa, ale chcę korzystać z interfejsu.

Być może mam to źle, jak powinienem modelować hierarchię dziedziczenia równoległego z zastrzykiem zależności? Zasadniczo abstract wzór fabryczny, czy to możliwe tutaj?

Chcę móc używać (CognitoAuthProvider, CognitoProfileProvider) lub (SomeOtherAuthProvider, SomeOtherProfileProvider) w miejsce moich interfejsów.

Odpowiedzi:

0 dla odpowiedzi № 1

Używając zarówno tokena, jak i samej klasy, musisz użyć useExisting zamiast useClass jak szczegółowe tutaj

  providers: [
...
CognitoAuthProvider,
{provide: AUTH_PROVIDER_IT, useExisting: CognitoAuthProvider},
{provide: PROFILE_PROVIDER_IT, useClass: CognitoProfileProvider}
]