【发布时间】:2017-05-23 08:38:19
【问题描述】:
我是 typescript 和 angular2/4 的新手,我正在构建一个具有两个基本实体的应用程序,即 Car 和 Driver,我所做的只是通过 API 调用列出它们。
我面临的问题是每个 CarService 和 DriverService 都有代码冗余,而其他实体服务的代码可能相同。
目前的实现如下,跳过其他方法进行说明:
@Injectable()
export class CarService {
private actionUrl: string;
private headers: Headers;
constructor(private _http: Http, private _configuration: Configuration) {
// Getting API URL and specify the root
this.actionUrl = _configuration.serverWithApiUrl + 'Car/';
this.headers = new Headers();
this.headers.append('Content-Type', 'application/json');
this.headers.append('Accept', 'application/json');
}
// Function to get all Cars - API CALL: /
public GetAll = (): Observable<Car[]> => {
return this._http.get(this.actionUrl)
.map((response: Response) => <Car[]>response.json())
.catch(this.handleError);
}
// Function to get a Car by specific id - API CALL: /:id
public GetSingle = (id: number): Observable<Car> => {
return this._http.get(this.actionUrl + id)
.map((response: Response) => <Car>response.json())
.catch(this.handleError);
}
// Function to add a Car - API CALL: /create
public Add = (newCar: Car): Observable<Car> => {
return this._http.post(this.actionUrl + '/create', JSON.stringify(newCar), { headers: this.headers })
.catch(this.handleError);
}
// Function to update a Car - API CALL: /
public Update = (id: number, CarToUpdate: Car): Observable<Car> => {
return this._http.put(this.actionUrl + id, JSON.stringify(CarToUpdate), { headers: this.headers })
.catch(this.handleError);
}
// Function to delete a Car - API CALL: /:id
public Delete = (id: number): Observable<Response> => {
return this._http.delete(this.actionUrl + id)
.catch(this.handleError);
}
// Function to throw errors
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
DriverService 唯一改变的是 url 末尾的 Car/ 和 Observable<Car[]> 中的数据类型和响应。
我想知道使用通用服务避免这种情况的最佳方法是什么,以及如何在 Typescript 中做到这一点。
【问题讨论】:
-
为什么还要为此提供服务?为什么不直接使用 http 服务作为通用服务呢?
-
或者您可能想查看 ngx-resource 库。 github.com/troyanskiy/ngx-resource
-
我的服务中有多个函数,但为简单起见,我隐藏了其他调用。
-
不要,它们可能是相关的。 :)
-
我用完整的服务更新了问题,驱动程序和其他实体服务是一样的,只有url和数据类型会改变,所以我想到了一个通用服务但我不知道如何实现它,我找不到一个完整且解释清楚的方法来使用服务来实现它
标签: angular generics typescript service