【问题标题】:Which layer should i declare enums?我应该在哪一层声明枚举?
【发布时间】:2014-08-20 09:11:42
【问题描述】:

我有一个包含 5 层的 C# N 层项目: 1-基础设施 2-域 3-AppService 4-分布式服务 5-演示文稿

我想在我的项目中使用枚举。但我不知道是哪一层描述了它们。我对此有两个想法。

1- 在域中声明枚举并通过 WCF DataContract 传递网络。

2- 在类库项目中声明枚举(例如:在公共层中)并将其构建为 dll 并在所有层中使用它。

帮我选一个。

【问题讨论】:

  • 取决于哪些层将访问枚举。如果所有层都需要访问,您可能应该创建一个核心层并将它们放在那里

标签: c# architecture enums n-tier-architecture n-layer


【解决方案1】:

在多层解决方案中,每一层应该只依赖于它下面的层。例如,如果您正在使用 DDD,您可能会有这个

表示层(应该取决于应用层) 应用层(应该依赖于基础层) 基础设施层(应取决于域层) 领域层(不应依赖任何层)

所以基本上枚举通常是域的一部分,如果你不想映射,映射,映射,那么你应该向你的表示层和应用层添加额外的依赖项(依赖于域)。如果你想让你的架构保持整洁,那么你所能做的就是 - 地图。就我个人而言,我不喜欢映射枚举,因为如果没有要映射的内容,您将不得不发明新的枚举类型或抛出异常。这两种解决方案都没有我希望的那么清晰。

更新

还可以考虑使用枚举类

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/enumeration-classes-over-enum-types

【讨论】:

    【解决方案2】:

    我个人一直在研究 oniony-DDDish 解决方案,并且在所有层中都有重复的枚举和映射器非常乏味,而且永远不会觉得它是干净的。我的解决方案是在域层中拥有所有枚举,然后一旦数据到达外层(当然除了应用服务层),它就会变成 int casts。想一想:为什么还需要枚举?您应该在域层中拥有所有逻辑,您不应该在域层之外执行诸如“if (bar.type == types.foo)”之类的事情,这只是反模式。如果您确实需要在另一层中再次使用枚举值,只需声明一个重复的枚举并将其转换回......它通常可能发生在测试程序集中。

    【讨论】:

    • 对我的最佳回答。我过度思考了我的解决方案,最终将字符串值从 API 传递到了我真正需要枚举并解析它的层。
    【解决方案3】:

    我会就这个问题分享我的意见:

    • 策略 1:域层定义了一个枚举 AddressType(有 Home、Work...)。 服务层 定义了另一个枚举 AddressTypeDto,所有值都为 Home、Work...),它们实际上映射自 AddressType ==> AddressTypeDto。在表示层,AddressTypeDto 类型也将被使用。

    • 策略 2:创建一个层 (not really a layer),其中包含常见的枚举类型并在域/服务/表示的不同层中使用它

    S1:它保持所有层域/服务/呈现独立,但需要更多类来呈现相同的东西

    S2:它保持所有层域/服务/表示独立,但需要它们取决于“通用”dll。

    我看到了实现这两种策略之一的应用程序。我会选择 Strategy 2 因为它更有效。几乎应用程序通常都有共同点,一些枚举类型应该存在。

    【讨论】:

    • 不错的答案。我和你一起去。但正如您所说,策略 2 更有效且更干燥。从 DDD 的角度来看,您可以在域和应用程序中使用它。
    【解决方案4】:

    这取决于您需要在哪里使用枚举所代表的值。如果这些是您的表示层需要的值,那么这就是它们应该去的地方。如果它是您的服务层所依赖的东西,那么您需要将它们放在那里。

    我不确定最好的方法是将所有枚举集中到一个位置。它们应该分布在整个应用程序中,位于依赖它们的最低层,通常与使用枚举并对它们执行一些逻辑的类位于同一命名空间中。

    如果应用程序和域将使用它们,则在域中声明它们并通过网络传递值。

    【讨论】:

      【解决方案5】:

      如果只需要在某个特定层中使用它,则在该层中声明它。如果你想在所有层中使用它,那么它应该在某个公共层中声明,并且应该为所有使用它的层添加一个引用。

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多