Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在哪一层声明枚举?_C#_Architecture_Enums_N Tier Architecture_N Layer - Fatal编程技术网

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

C# 我应该在哪一层声明枚举?,c#,architecture,enums,n-tier-architecture,n-layer,C#,Architecture,Enums,N Tier Architecture,N Layer,我有一个C#N层项目,它有5层: 1-基础设施 2-域 3-AppService 4-分布式服务 5-介绍 我想在我的项目中使用枚举。但我不知道哪一层描述它们。我有两个想法 1-声明域中的枚举并通过WCF DataContract通过网络 2-在类库项目中声明枚举(例如:在公共层中),将其构建为dll并在所有层中使用 请帮我选择一个。如果只需要在某个特定层中使用,请在该层中声明它。如果要在所有层中使用它,则应在某个公共层中声明它,并向使用它的所有层添加引用。这取决于需要在何处使用枚举表示的值。如

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

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

1-声明域中的枚举并通过WCF DataContract通过网络

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


请帮我选择一个。

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

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

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


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

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

  • 策略1:域层定义一个enum
    地址类型
    (有家、有工作……)服务层定义另一个enum
    AddressTypeDto
    和所有值Home、Work…),它们实际上从
    AddressType
    ==>
    AddressTypeDto
    映射。在表示层上,还将使用类型
    AddressTypeDto

  • 策略2:创建一个包含常见枚举类型的层
    不是真正的层
    ),并在域/服务/表示的不同层中使用它

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

S2:它保持所有层域/服务/表示独立,但需要依赖于“公共”dll的层


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

在多层解决方案中,每一层应该只依赖于它下面的层。例如,如果您使用的是DDD,那么您可能会遇到这种情况

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

所以基本上枚举通常是域的一部分,如果您不想映射、映射、映射,那么您应该向表示层和应用程序层添加其他依赖项(取决于域)。如果你想保持你的架构像wistle一样干净,那么你所能做的就是-map。就我个人而言,我不喜欢映射枚举,因为如果没有什么可映射的,就必须发明新的枚举类型或抛出异常。这两种解决方案并不像我希望的那样清晰

更新

也考虑使用枚举类


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

取决于哪些层将访问枚举。如果所有层都需要访问,您可能应该创建一个核心层并将它们放在正确的答案中。我和你一起去。但正如你所说,战略2更有效、更干练。从DDD的角度来看,你可以在域和应用中使用它。最好的答案是我。我过度思考了我的解决方案,最终将字符串值从API的表示层传递到我真正需要枚举的层并对其进行解析。