【问题标题】:Angular the best solution for mapping objects, Class or service or static functionsAngular 是映射对象、类或服务或静态函数的最佳解决方案
【发布时间】:2018-10-22 23:14:16
【问题描述】:
我需要使用转换器将 json 结果映射到我的本地类对象,所以我对此有一些想法:
- 创建一个类“JsonResult2TableElementConverter”
- 创建一个可以包含项目所有转换器的可注入服务
- 创建函数“export let function convertJson2Table()”等。
你能告诉我哪个更好吗?可能是另一个?
你有类似的经历吗?
谢谢。
【问题讨论】:
标签:
angular
typescript
dependency-injection
【解决方案1】:
首先最好在后端进行转换。服务器应该为前端返回友好的 DTO。
@JFPicard 解决方案仅当您在 Angular 中使用实体模型的类时才有效。然后你可以像 ActiveDirectory 模式一样在模型中添加方法。
不幸的是很多人都在使用实体模型的接口。这种方法在 Angular 中有很多好处。在这种情况下,最好将所有内容都包装在可注入服务中。稍后你可以通过 Angular DI 机制来模拟这个服务。它是:
- 更易测试
- 更具可扩展性
- 您可以通过 Angular 的 DI 轻松更改行为
将此逻辑移动到分离的可注入服务中,将此逻辑封装在分离层中。封装你的类中的所有东西会使这个类变胖,将来模拟这个函数就不会那么容易了。
PS。在 Angular 不可注入(因此它们不是 Angular 服务)和 包含任何应用程序逻辑中使用纯 typescript 类总是让我害怕。对我来说,这就像在 DI 容器之外创建的 ASP.NET 中的“Helper”类,后来真的很痛苦。
【解决方案2】:
在我看来,获得一个转换类违反了 SOLID 的单一责任原则。
我认为最好的方法是让本地类对象具有一个函数或构造函数,该函数或构造函数采用 JSON 结果来构建类。
因此,转换的责任在于使用数据的类。因此,如果您需要修改任何逻辑,您只需触及相关类,而不是具有大量转换函数的巨大类。
@Karol Trybulec:
本地类应该由可注入服务返回为:
export class TestService {
public constructor (private http: HttpClient) {
}
public callHttp (url: string, parameters: any): Observable<DTOTest> {
return this.http.get(url, {params: parameters})
.pipe<boolean>(map((result) => {
return of(new DTOTest(result));
}));
}
}