【问题标题】:Should we map enums in multi layer projects?我们应该在多层项目中映射枚举吗?
【发布时间】:2019-03-25 12:59:26
【问题描述】:

在编写企业应用程序时,总是有 n 个层。我个人不喜欢使用 AutoMapper 等工具。我避免使用 Automapper 的大部分原因都在这里说明https://cezarypiatek.github.io/post/why-i-dont-use-automapper/

从时间上讲,这几乎是相同数量的工作,而手动映射 IMO 会带来更大的好处。

到目前为止,我一直在做的是在层之间映射枚举。但我有一个问题。每一层都不会向枚举添加额外的值/内容,它只是普通的映射。我讨厌它,尤其是因为如果没有适当的映射值,您将不得不执行以下操作之一(并且它们都不是一个好的解决方案)

例如 A层

public enum Sometype
{
    ACTIVE,
    INACTIVE,
    PENDING,
    DELETED
}

B层

public enum Sometype
{
    ACTIVE,
    INACTIVE,
    DELETED
}

如果您在层 A 中添加值 PENDING 而忘记在层 B 中添加 PENDING,您的映射将被破坏。要解决这个问题,你可以

a) 抛出异常 - 不太急于发现生产中的错误,因为这样一个微不足道的问题

b) 在 B 层中引入一个新的枚举——例如 UNKNOWN(作为默认值)——它不会向 B 层上下文添加任何值,即。什么是未知状态?

c) 将枚举映射到默认值 - 这几乎总是错误的。

更新

如果我们使用基于 DDD 方法的编码,大多数枚举将位于域层。将域的基本部分提取到新层并没有任何意义,除了能够在不同层重用枚举之外。将所有层的引用添加到域层是可能的。

所以我的问题是我们应该在层之间映射枚举,还是应该使用最初声明的初始枚举?

【问题讨论】:

  • 枚举可以添加到共享项目中并在所有层中使用
  • 这应该是两层都用的通用类型,所以同类型没问题。
  • @EhsanSajjad 在做 DDD 的时候呢?为什么要将域的重要部分提取到新层?
  • 我们通常将这些实体放在名为 Enums 的命名空间中的实体中

标签: c# enums mapping


【解决方案1】:

您应该使用共享项目来共享枚举,或层之间的任何公共代码。有关共享项目的更多详细信息here

【讨论】:

    【解决方案2】:

    对此,我只能提供我的意见,但当我遇到同样的问题时,我会结合使用这两种解决方案。如果枚举确实是一个横切关注点,那么它会跨项目共享。但是,当一个枚举可以限定为一个层,然后我只需要它的一个子集在另一个层中时,它就会被映射。只是在第二种情况下要小心,我发现当我几年后回到它时,需要一分钟才能记住什么是什么;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2014-08-20
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多