C#(VS2019):当两者都使用 class 使用 VS 项目结构时,如何将域层与数据层分开

C# (VS2019): How to separate a domain layer from a data layer when both use a class using VS project structure

我有一个遵循三层架构的简单 IS。到目前为止,我已经将所有代码都放在一个项目中并由文件分隔。 我知道,使用 Visual Studio IDE,组件应该打包在 VS 解决方案中的单独 VS 项目中。分离项目中的表示层不是问题,但我很难分离领域层和数据访问层。数据库由数据映射器访问,returns 一个域对象保存域逻辑的数据。 但是这个对象是在领域层组件中定义的,组件之间不应该有循环引用,所以我不知道如何解决两个组件中需要一个class的问题。

我应该复制粘贴声明吗?但是随后每个更改都必须手动在两个组件中进行镜像。还是我对映射器或图层的理解有问题?

将您的应用程序的层想象成一个洋葱 - 最内层周围有另一层,第三层围绕着它。图层可以引用自身内部的图层,但不能引用自身外部的图层。

最内层是域项目 - 它不引用任何其他项目,并且通常几乎没有任何外部依赖项。

下一层是数据访问/存储库项目 - 它引用域项目,因为它负责将域对象写入数据存储并从数据存储中读取它们。它可能还引用了一些外部包,例如 Entity Framework 以协助访问数据存储。

最外层是 UI/presentation 项目——它可以引用域项目和数据存储项目,因为它可以创建、操作和显示域对象,它还可以告诉数据访问层读取和写入 to/from 数据存储。

对于更复杂的应用程序,您可能希望每一层有多个项目,或者您可能需要超过 3 层,并且您可能希望传递 DTO(数据传输对象)或视图模型 to/from 演示文稿层而不是通过所有层传递域对象。这里已经有很多关于该主题的问题,例如 Should services always return DTOs, or can they also return domain models?,并且没有放之四海而皆准的答案,但是 3 层,每层一个项目是目前开始的好地方。

我理解如何将域层与数据访问层分开的关键突破是理解 域对象不需要知道如何将自己写入数据或从数据中读取自己store 因为那是数据访问层的职责,所以领域项目不需要引用数据访问项目。域层既不知道也不关心您的数据存储是 SQL 服务器数据库、一堆文本文件还是带有笔记本的小鬼(无偿 Discworld 参考)。

所以,回到最初的问题,

Should I copy-paste the declaration? But then every change must be mirrored in both components manually.

对于小型应用程序,数据访问层可以使用域层中定义的 类。对于较大的应用程序,您可能希望定义域的数据访问层版本 类,但前提是这样做有价值。不要仅仅为了遵循某种模式而复制代码 - 使用适合您的应用程序的模式。