我应该在哪一层声明枚举?

本文关键字:一层 声明 枚举 我应该 | 更新日期: 2023-09-27 18:10:56

我有一个c# n层项目,有5层:1-Infrastructure2-Domain3-AppService分布式的服务5-Presentation

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

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

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

帮我选一个

我应该在哪一层声明枚举?

我想谈谈我对这个问题的看法:

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

  • 策略2:创建一个包含常见枚举类型的层 (not really a layer),并在Domain/Service/Presentation

  • 的不同层中使用它

S1:它保持所有层Domain/Service/Presentation独立,但需要更多的类来表示相同的东西

S2:它保持所有层Domain/Service/Presentation独立,但要求它们依赖于"公共"dll。

我看到了实现这两种策略之一的应用程序。我会选择 Strategy 2 ,因为它更有效率。大多数应用程序都有一些共同的东西,一些enum类型应该在那里。

这取决于您需要在何处使用枚举所表示的值。如果这些值是您的表示层需要的,那么它们就应该放在这里。如果它是你的服务层所依赖的东西,那么你需要把它们放在那里。

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

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

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

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

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

所以基本上枚举通常是域的一部分,如果你不想映射,映射,映射,那么你应该添加额外的依赖到你的表示层和应用层(依赖于域)。如果你想保持你的架构像口哨一样干净,那么你所能做的就是——映射。就我个人而言,我不喜欢映射枚举,因为如果没有什么可映射的,你将不得不发明新的枚举类型或抛出异常。两种解决方案都不像我希望的那样清楚。

还可以考虑使用枚举类

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

我个人一直致力于onion - dddish解决方案,并且在所有层中都有重复的枚举和映射器是非常乏味的,并且永远不会感觉它是干净的。我的解决方案是将所有枚举都放在域层,然后一旦数据进入外层(当然应用程序服务层除外),它就都变成了int类型转换。想想看:为什么你还需要枚举?你应该在领域层有所有的逻辑,你不应该做像if (bar。Type == types.foo)'在域层之外,它只是反模式。如果真的需要在另一层中再次使用枚举值,只需声明一个重复的枚举并将其强制转换回来……它可能通常发生在测试程序集中。