انگولار - گسترش یک کلاس پایه در مقابل تزریق آن در تایپاسکریپت
من روی یک برنامه انگولار 4 کار میکنم و به وضعیتی رسیدم که یک کلاس سرویس پایه htpInterceptor دارم که دارای توابع عمومی GET، POST و DELETE در تایپاسکریپت است. من میخواهم تمام سرویسهای انگولار من از این کلاس پایه استفاده کنند. حالا مطمئن نیستم که آیا باید این سرویس پایه را در تمام سرویسهایم تزریق کنم یا باید تمام کلاسهای سرویس خود را با این کلاس سرویس پایه توسعه دهم.
آیا باید از export class AuthService extends HttpInterceptorService استفاده کنم یا constructor(private _interceptor: HttpInterceptorService) { }
تفاوت (مزایا و معایب) بین این دو رویکرد چیست؟
در ادامه کلاس سرویس پایه من آمده است،
@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());
}
}
پاسخ شماره ۱
مزایا و معایب به مورد بستگی دارد. اما کد بالا نمونهای کلاسیک از معضل ترکیب در مقابل ارثبری است. و رویکرد توصیهشده به طور کلی ترکیب به جای ارثبری است.
در این مورد انتظار میرود HttpInterceptorService به عنوان جایگزین توسعهیافته برای Http عمل کند. بنابراین باید به جای Http تزریق شود.
اگر AuthService قرار است HttpInterceptorService را پیادهسازی کند و عملکرد آن را توسعه دهد (مثلاً روشهای موجود را پوشش دهد و هدرهای احراز هویت را اضافه کند)، باید از HttpInterceptorService وراثت یابد.
پاسخ شماره ۲
با یک سرویس وارداتی، شما به DI انگولار متکی هستید و تصمیم میگیرید در چه سطحی آن را شامل کنید.
استفاده از extends به نحوۀ بومی ES6 متکی است، بنابراین ممکن است قابل حملتر باشد.
پس حدس میزنم این بیشتر مسئلهی ترجیح شخصی است و اینکه آیا فکر میکنید ممکن است کدتان را خارج از Angular استفاده کنید یا نه.
همچنین با استفاده از extends شما باید در هر سازندهای که کلاس والد را فراخوانی میکند، super() را صدا بزنید. این حس روش انگولار را نمیدهد اگر برای شما مهم باشد...