洋葱架构 - 我们应该在我们的核心POJO中允许杰克逊注释吗?

时间:2018-03-15 17:27:02

标签: jackson domain-driven-design separation-of-concerns onion-architecture

我有一个接收JSON消息的应用程序,然后将其反序列化为POJO。我已经研究了几周的洋葱建筑,我偶然发现了这种情况下的一个长期困境。由于我使用Jackson Deserializer,我被迫使用Jackson Annotations来协助反序列化过程。应用程序核心需要这个Jackson POJO,这就是问题所在。由于反序列化是基础设施问题,因此在我的核心中使用带有Jackson注释的类是不正确的,对吗?

我看到两个选项:

1 - 我的核心将有一个类似于Jackson POJO的POJO,但没有注释。杰克逊POJO将在基础设施中,然后我将使用映射框架将杰克逊POJO映射到域POJO。

基础架构层中的POJO:

public class MyUser {

    private String firstName;
    private String lastName;

    @JsonProperty("first_name")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @JsonProperty("last_name")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

核心层中的POJO:

public class MyUser {

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

2 - 假设杰克逊是横切的,因此可以通过各层使用。

我认为,考虑到我正在关注洋葱架构,选项1更合适。但是,坚持使用此选项将迫使我复制对象,这对我来说听起来不太好。

真的只有这两种选择吗?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您需要,您的解决方案是 数据传输对象设计模式 DTO 的众所​​周知的解决方案了解更多相关信息。

在我看来,这些不是对象重复。它们是相同域概念的不同表示,每个都适应特定应用层的需要。因为每种模式都有强制要求使用它们的时候,有些时候它是无用的,而且比任何东西都更具破坏性。

根据我自己的经验讲述的故事:我们有一个项目,我们选择为每一层使用相同的POJO以避免重复并且必须处理映射。几个星期后,我们遇到了一些我们“被砍掉”的小问题。

稍后,这些问题变得更加严重(性能,API层中的数据库问题......)以及最难修复的问题。在经历了很多头痛之后,我们同意映射和POJO重复是有道理的。

但相反的情况也可能发生:您可以使用简单的CRUD应用程序进行严格的分层,只需很少的逻辑。然后严格的分层架构浪费时间和精力。

通常答案是:这取决于你想要建立什么。 应用程序越大越复杂(可扩展性在这里是一个真正的问题),架构必须越严格。但是一个简单的应用程序(或更大结构的任何简单节点)需要保持简单。

希望它有所帮助!