angular - Typescript'te bir temel sınıfı genişletmek vs onu enjekte etmek
Angular 4 uygulaması üzerinde çalışıyorum ve TypeScript generic GET, POST ve DELETE fonksiyonlarına sahip bir htpInterceptor temel servis sınıfımın olduğu bir duruma geldim. Tüm Angular servislerimin bu temel sınıfı kullanmasını istiyorum. Şimdi, bu temel servisi tüm servislerime enjekte etmeli miyim yoksa tüm servis sınıflarımı bu temel servis sınıfından mı türetmeliyim emin değilim.
Kullanmalı mıyım, export class AuthService extends HttpInterceptorService YOKSA constructor(private _interceptor:HttpInterceptorService) { }
Bu iki yaklaşım arasındaki fark nedir (avantajları ve dezavantajları)?
Aşağıda benim temel servis sınıfım bulunmaktadır,
@Injectable()
export class HttpInterceptorService {
constructor(private _http: Http) { }
get<T>(relativeUrl: ApiUrl): Observable<T> {
const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
let apiUrl = baseUrl + relativeUrl.toString();
return this._http.get(apiUrl).map(res => <T>res.json());
}
post<T>(relativeUrl: ApiUrl, inputData: any): Observable<T> {
const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
let apiUrl = baseUrl + relativeUrl.toString();
if (inputData === undefined) {
return this._http.post(apiUrl, undefined).map(res => <T>res.json());
}
else {
return this._http.post(apiUrl, inputData).map(res => <T>res.json());
}
}
delete<T>(relativeUrl: string): Observable<T> {
const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
let apiUrl = baseUrl + relativeUrl;
return this._http.delete(apiUrl).map(res => <T>res.json());
}
}
Cevap #1
Artılar ve eksiler duruma bağlıdır. Ancak yukarıdaki kod klasik bileşim ve kalıtım ikilemi. Ve genellikle önerilen yaklaşım kalıtım yerine bileşimdir.
Bu durumda HttpInterceptorService'in Http için genişletilmiş bir yedek olarak çalışması beklenir. Bu nedenle Http yerine enjekte edilmesi gerekir.
Eğer AuthService, HttpInterceptorService'i uygulamak ve işlevselliğini genişletmek (örneğin mevcut metodları sarmak ve kimlik doğrulama başlıkları eklemek) amaçlıyorsa, HttpInterceptorService'den türemiş olmalıdır.
Cevap #2
İthal edilen bir servisle Angular'ın DI sistemine güvenirsiniz, hangi seviyede dahil edeceğinize siz karar verirsiniz.
extends kullanmak, yerel ES6 sözdizimine dayanır, bu yüzden daha taşınabilir olabilir.
Yani sanırım bu büyük ölçüde bir tercih meselesi ve kodunuzu Angular dışında kullanıp kullanmayacağınızı düşünüp düşünmemenizle ilgili.
Ayrıca extends ile, ebeveyn sınıfı çağıran her yapıcıda super() çağırmanız gerekecek. Eğer bunu önemsiyorsanız, bu Angular tarzı gibi hissettirmiyor...