我正在试图弄清楚如何在数据,业务和UI层之间共享我的实体。是否最好为所有层引用的这些实体创建单独的项目? Enums和自定义异常怎么样?我有一些仅由UI项目使用的枚举,以及一些由业务使用的枚举。这是否意味着我应该有两个单独的Enum文件夹:一个在Business项目中,另一个在UI中?与Exceptions类似?到目前为止,我一直在一个单独的项目中维护实体,枚举和例外,这些项目由所有3个层引用。
My Business项目包含Manager类(如ProductManager.cs),其中包含List GetProducts()和SaveProduct(Product)等方法。
答案 0 :(得分:2)
如果这些实体在所有这些层中具有语义含义,我建议将它们放在所有层都知道的单独项目/程序集中。
如果您有一个特定于某个图层的实体,我会将它们限制在该图层中。因此,例如,您不允许UI代码抛出业务层异常,或允许业务层使用UI枚举。
根据您正在做的事情,将特定于图层的类型保留在您保留共享类型的同一项目/程序集中可能没有坏处,但我会考虑将它们限制在自己的图层中作为最佳实践。
答案 1 :(得分:2)
你一直在做正确的事。创建一个包含所有实体的单独项目几乎总是可行的方法。如果枚举和例外与实体相关,那么它们也属于那里。
答案 2 :(得分:2)
思考封装。 将它们放置在需要它们的范围内,而不是在更广泛的范围内。
如果仅在UI图层中使用某些内容,请不要将其公开给其他图层。但如果它在两层或三层中使用,则在最低层中定义它(例如,如果UI位于数据库上的业务逻辑上,则BL和UI中使用的内容可以在BL中定义)。或者,如果某些内容或多或少是全局的,请将其移至第三方共享库。
此外,尽量减少对共享实体的需求:例如:建议(出于好的理由)避免自定义异常。它们中的大多数通常可以由具有一些额外信息的现有系统异常来表示(例如,消息中包含详细信息的InvalidOperationException),最大限度地减少了在任何地方处理全新异常类的需要 - 以及无需决定在哪里定义自定义异常类型。
答案 3 :(得分:1)
我通常将枚举和自定义异常与接口定义一起放在一个单独的项目中。
答案 4 :(得分:1)
如果你需要所有层中的实体,那么使用单独的项目是(imo)最好的方法。