Asp.net mvc ASP.NET MVC体系结构中的业务逻辑层

Asp.net mvc ASP.NET MVC体系结构中的业务逻辑层,asp.net-mvc,Asp.net Mvc,我对ASP.NETMVC还相当陌生。我真的对我的项目的架构感到困惑。让我向你们解释我的困惑: 在我的项目中,我有三个我们大家都知道的部分。这些是:控制器、模型和视图 控制器位于控制器文件夹内,视图位于视图文件夹内,模型位于模型文件夹内 众所周知,有两种模型:数据模型和业务模型。数据模型具有要在项目中使用的所有数据类型,业务模型具有与项目相关的附加逻辑。除此之外,还有一个应用程序的数据层,它与数据库进行通信 我将为这个数据层创建一个类库项目,它将与数据库通信。另外,我的MVC项目的Models文件

我对ASP.NETMVC还相当陌生。我真的对我的项目的架构感到困惑。让我向你们解释我的困惑:

在我的项目中,我有三个我们大家都知道的部分。这些是:控制器、模型和视图

控制器位于
控制器
文件夹内,视图位于
视图
文件夹内,模型位于
模型
文件夹内

众所周知,有两种模型:数据模型和业务模型。数据模型具有要在项目中使用的所有数据类型,业务模型具有与项目相关的附加逻辑。除此之外,还有一个应用程序的数据层,它与数据库进行通信

我将为这个数据层创建一个类库项目,它将与数据库通信。另外,我的MVC项目的
Models
文件夹将只包含数据模型,我还将为业务模型类创建一个不同的库

现在我面临的问题是:

假设我的MVC项目的名称是
MVCProj
,数据层项目的名称是
DataProj
,业务层项目的名称是
BusinessProj
。 如果我在
MVCProj
Models
文件夹中定义数据类型,我必须在
BusinessProj
DataProj
项目中包含其引用。此外,我还必须在我的
MVCProj
中使用
BusinesProj
类。因此,我必须在
MVCProj
中添加
BusinessProj
的引用,这会导致循环依赖


我不确定我设想的架构是否正确。请帮我整理一下。

建筑中没有银弹,所有这些都不是必须的,但取决于项目

应用程序中的层数量在很大程度上取决于需求

一方面,额外的层将关注点(例如:从数据访问到业务逻辑)分开;另一方面,每一层都会增加工作量,降低性能

关于你的问题,可以,当一层依赖于另一层时,第三层依赖于第一层是不可以的

在您的情况下,您选择3个级别,理想情况下应该是这样

DataAccess,其数据类位于单独的项目中

BusinessLogic是另一个项目,它调用数据访问,并将结果转换为其数据类


最后,在模型参考BusinessLogic only上,Arsen的回答已经解释得很好了,但我只想发表我自己的经验(这太长了,无法发表评论)

您分离业务逻辑和数据访问的想法很好。我参与的大多数项目都是以类似的方式组织的

在你的情况下,我会做的是:

1-为DataAccess创建项目:
MVCProj.DataAccess

2-创建另一个仅包含数据库实体的项目:
MVCProj.Entities

3-在
MVCProj.DataAcess
项目中添加对
MVCProj.Entities
的引用

4-为业务层创建项目:
MVCProj.business

5-在
MVCProj.Business
项目中添加
MVCProj.Entities
MVCProj.DataAcess
的引用(我假设业务层将调用数据库)

6-将
MVCProj.Entities
MVCProj.Business
的参考添加到MVC项目中

明白逻辑吗?每一层都负责完成“它的工作”。现在MVC控制器可以调用business,即调用数据库来保存记录。所有项目共享相同的实体

MVC项目上的“Models”文件夹只是团队提供的一个示例。在web上的大多数示例中,您会看到人们直接在控制器内部调用数据库(主要使用实体框架)。这是可行的,但从长远来看,很难维持下去

大多数人做的另一件事是:通常不希望返回控制器中的数据库实体。可能它们包含的属性比您需要的更多,等等。在这种情况下,您可以创建称为ViewModel的对象。设想一个ViewModel,它类似于实体类的副本,但只包含与视图相关的字段。ViewModels特定于MVC项目,因此它们将保留在MVC项目内的文件夹中。您可以选择将其称为模型或视图模型

虽然没有太多的进展,但是通过我上面展示的项目分离,您可以明确地寻找一个依赖注入框架来处理为您创建的所有类实例。:)

注意:这是隐含的,但除MVC项目外,所有项目都只是普通的旧类库


希望这有助于澄清您的想法。

我写了一篇文章,我认为我的文章有助于解决您的一些困惑:

TL;DR您在这里感到困惑的主要原因似乎是您认为您需要MVC项目的
models
文件夹中的“数据模型”(实体)。这在两个方面都是错误的。首先,
Models
文件夹毫无意义。你可以重命名它,删除它,随便什么。它根本不会影响您的应用程序。第二,正如我在文章中提到的细节,实体不是模型。它们是,也应该是,仅仅是一个表结构的表示,为您的ORM(可能是实体框架)提供一些空间来填充它从数据库检索到的数据

也就是说,典型的方法如下所示:

  • 包含上下文和实体的“DAL”类库。这就是迁移的方向
  • 一个“业务”类库,基本上包装了DAL,基本上提供了一个API,您的MVC项目可以使用该API获取数据。根据应用程序的复杂程度,这一层是最可替换的,因为您经常会这样做