首页 > 解决方案 > 将数据访问代码拆分为单独的项目

问题描述

我有一个使用 ASP.NET CORE 3.1(使用 Razor Pages)构建的 Web 应用程序。我正在使用 Entity Framework Core(代码优先)进行数据访问。一切都在同一个项目中,我们称之为 MyProject.Web。

现在我必须创建一个使用相同数据库的控制台应用程序。我的计划是将它作为一个新项目添加到与 Web 应用程序相同的解决方案中:MyProject.Console。

由于控制台应用程序将使用相同的数据库,在我看来,在解决方案中创建另一个项目 MyProject.Data 似乎是个好主意,它将包含用于数据库访问的实体和所有代码。这样,Web 应用程序和控制台应用程序都可以使用相同的代码进行数据访问。

这是一个好主意吗?

我已经遇到了一些问题……我的实体已将验证实现为属性(来自 System.ComponentModel.DataAnnotations;)。但是,我还创建了一个自定义验证属性,要将其应用于实体,我还需要在 MyProject.Data 中具有验证属性类。此验证属性实现接口 IClientModelValidator 以便我的自定义验证也可以应用于客户端。IClientModelValidator 接口位于 Microsoft.AspNetCore.Mvc.ModelBinding.Validation 命名空间中。首先,我不知道如何将必要的框架(Microsoft.AspNetCore.App)添加到项目MyProject.Data中。其次,无论如何添加该框架似乎有点奇怪,因为这应该只是一个数据访问项目。

任何关于如何解决这个问题的建议,或者即使它是一个好主意,都非常受欢迎。

标签: asp.net.netasp.net-coreentity-framework-core

解决方案


是的,分离项目(Web App Project、Console App Project 和 Datebase Project)是个好主意。但是将域模型(数据库对象)暴露给 UI(Web 和控制台应用程序)是个坏主意。

因此,在数据库项目中,您将添加所有带有 EF/数据库注释 (System.ComponentModel.DataAnnotations) 的域模型类,而无需任何 UI 验证。

在 Web 应用程序项目中,您必须添加 ViewModel/DTO 类,在这里您可以添加所需的验证以及与 UI 相关的任何内容,例如将域模型上的名字和姓氏属性组合到 FullName 属性并在 UI 上显示。

您可以在此处查看有关 ViewModel 的更多信息:

MVC 中的 ViewModel 是什么?https://www.tektutorialshub.com/asp-net-core/asp-net-core-model-and-viewmodel/


推荐阅读