Angular映射对象,类或服务或静态函数的最佳解决方案

时间:2018-10-22 13:27:14

标签: angular typescript dependency-injection

我需要使用转换器将json结果映射到我的本地类对象,所以我对此有一些想法:

  • 创建一个类“ JsonResult2TableElementConverter”
  • 创建一个可注入的服务,其中可以包括项目的所有转换器
  • 创建函数'export let function convertJson2Table()'等。

请告诉我哪个更好?可能是另一个吗? 您有类似的经历吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

我认为获取转换类违反了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));
        }));
    }
}

答案 1 :(得分:1)

首先,最好在后端进行转换。服务器应为前端返回友好的DTO。

@JFPicard解决方案很好,仅当您在Angular中为实体模型使用类时。然后,您可以像在ActiveDirectory模式中那样在模型中添加方法。

不幸的是,很多人正在使用实体模型的接口。这种方法在Angular中有很多好处。在这种情况下,将所有内容包装在可注入服务中会更好。稍后,您可以通过Angular DI机制来模拟该服务。是:

  • 更具测试性
  • 更具可扩展性
  • 您可以通过Angular的DI轻松更改行为

将此逻辑移至分离的可注入服务时,会将此逻辑封装在分离的层中。封装类中的所有内容将使此类变得繁琐,而将来模拟此功能将变得不那么容易。

PS。在Angular中使用纯类型脚本类不可注入(因此它们不是Angular服务)和包含任何应用程序逻辑总是让我感到恐惧。对我来说,这就像在DI容器外创建的ASP.NET中的“帮助程序”类,后来真的很麻烦。