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

时间:2014-06-30 03:40:01

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

我有一个包含5个图层的C#N层项目: 1,基础设施 2域 3 AppService服务 4分布式服务 5介绍

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

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

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

帮我选一个。

5 个答案:

答案 0 :(得分:12)

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

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

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

S1:它保持所有图层域/服务/演示文稿独立,但需要更多类来呈现相同的内容

S2:它保持所有图层域/服务/演示文稿独立,但需要它们取决于"普通" DLL。

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

在多层解决方案中,每一层应仅取决于其下面的层。例如,如果您正在使用DDD,则可能会有

表示层(应取决于应用程序层) 应用层(应取决于基础层) 基础结构层(应取决于域层) 域层(不应依赖任何层)

因此,基本上,枚举通常是Domain的一部分,如果您不想映射,映射,映射,则应在演示文稿和应用程序层中添加其他依赖项(取决于域)。如果您想保持体系结构整洁,那么您所能做的就是-映射。我个人不喜欢映射枚举,因为如果没有要映射的枚举,则必须发明新的枚举类型或抛出异常。两种解决方案都不像我希望的那样明确。

答案 4 :(得分:0)

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