【问题标题】: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));
              }));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        相关资源
        最近更新 更多