14

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

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

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

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

帮我选一个。

4

5 回答 5

18

我将分享我对这个问题的看法:

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

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

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

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

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

于 2015-07-28T15:19:44.210 回答
11

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

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

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

于 2014-06-30T03:46:45.387 回答
7

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

于 2014-06-30T03:46:03.013 回答
1

I've Personnally been working on a oniony-DDDish solution, and having duplicate enums and mappers in ALL the layers is damn tedious and can never feel like it's clean. My solution was to have all enums in the domain layer, then as soon as the data goes to outer layers (well except the app service layer of course), it all becomes int casts. Think about it : why would you still need the enum ? You're supposed to have all the logic in the domain layer, you're not supposed to do stuff like 'if (bar.type == types.foo)' outside the domain layer, it's just anti pattern. If you really need the enum value again in another layer, just declare a duplicate enum an cast it back ... It might typically happen in a test assembly.

于 2019-09-12T20:34:18.560 回答
1

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

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

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

更新

还可以考虑使用枚举类

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

于 2019-03-25T13:12:33.457 回答