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

Posted

技术标签:

【中文标题】C#(VS2019):当两者都使用使用 VS 项目结构的类时,如何将域层与数据层分离【英文标题】:C# (VS2019): How to separate a domain layer from a data layer when both use a class using VS project structure 【发布时间】:2022-01-15 01:46:17 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

对于更复杂的应用程序,您可能需要每层多个项目,或者您可能需要超过 3 个层,并且您可能希望将 DTO(数据传输对象)或视图模型传入/传出表示层,而不是传递通过所有层的域对象。这里已经有很多关于该主题的问题,例如Should services always return DTOs, or can they also return domain models?,并且没有一刀切的答案,但是现在 3 层,每层一个项目是一个很好的起点。

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

所以,回到原来的问题,

我应该复制粘贴声明吗?但是每个更改都必须手动镜像到两个组件中。

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

【讨论】:

感谢您提供令人筋疲力尽的回答,它清除了所有内容。 :-)

以上是关于C#(VS2019):当两者都使用使用 VS 项目结构的类时,如何将域层与数据层分离的主要内容,如果未能解决你的问题,请参考以下文章

VS2019无法创建Windows窗体应用程序(C#)

使用Visual Studio2019创建C#项目(窗体应用程序控制台应用程序Web应用程序)

VS 2019 (v16.10.4) 中缺少“添加新项目”模板

vscode项目转vs

vs2019 dumpbin使用不了?

[C#][Android]关于VS2019打开android项目不显示存档问题探讨