我们应该在多层项目中映射枚举吗?

时间:2019-03-25 12:59:27

标签: c# enums mapping

编码企业应用程序时,总是有n层。我个人不喜欢使用AutoMapper之类的工具。 https://cezarypiatek.github.io/post/why-i-dont-use-automapper/

列出了我避免使用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方法的代码,则大多数枚举将位于“域”层中。将Domain的必要部分提取到新层实际上没有任何意义,而能够在不同的层中重用Enums。可以将所有层的参考添加到“域”层。

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

2 个答案:

答案 0 :(得分:0)

您应该使用Shared项目在层之间共享Enum或任何通用代码。有关共享项目here

的更多详细信息

答案 1 :(得分:0)

我只能提供我的意见,但是当我遇到相同的问题时,我会同时使用两种解决方案。如果枚举确实是一个横切关注点,那么它将在项目之间共享。但是,当一个枚举可以划分为一个层,然后我只需要在另一个层中将其子集覆盖时,就可以对其进行映射。在第二种情况下要小心,我发现几年后再回到它时,花点时间记住什么是;)