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



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

我应该复印粘贴申报单吗?但是,必须手动在两个组件中镜像每个更改。或者我对映射器或图层的理解有问题吗?

将应用程序的层视为洋葱——最内层,周围有另一层,周围有第三层。图层可以参照其内部的图层,但不能参照其外部的图层。

最内层是域项目,它不引用任何其他项目,通常很少有外部依赖关系。

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

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

对于更复杂的应用程序,您可能希望每层有多个项目,也可能希望有3个以上的层,并且您可能希望将DTO(数据传输对象(或视图模型传递到表示层/从表示层传递,而不是将域对象传递到所有层。关于这个主题,这里已经有很多问题了,比如服务应该总是返回DTO吗,或者它们也可以返回域模型吗?,没有一个一刀切的答案,但3层,每层一个项目是一个很好的开始。

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

所以,回到最初的问题,

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

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

最新更新