如何将数据从表示层传递到业​​务逻辑层? (ASP.NET MVC 5)

Posted

技术标签:

【中文标题】如何将数据从表示层传递到业​​务逻辑层? (ASP.NET MVC 5)【英文标题】:How do I pass data from presentation layer to business logic layer? (ASP.NET MVC 5) 【发布时间】:2015-08-17 01:25:45 【问题描述】:

我正在使用 ASP.NET MVC 5 创建我的第一个 Web 应用程序,并希望以正确的方式进行。我计划创建一个包含表示层 (MVC)、数据访问层 (DAL) 和业务逻辑层 (BLL) 的架构。 DAL 和 BLL 将是独立于 MVC 项目的类库。这个想法是 MVC 项目将引用 BLL 来执行业务逻辑,然后引用 DAL 来与数据库交互。我正在使用存储库模式。

我的问题是,数据如何在层之间传递?例如,假设我在 MVC 项目中有一个实体框架模型,用于具有属性 FirstName 和 LastName 的 Student 类。然后我创建了一个强类型视图,用户可以通过填写一个简单的表单并单击“保存”来添加学生。 Student 模型会发布到Controller中对应的action方法,对吗?那么控制器不需要将学生对象发送到 BLL 并从那里发送到 DAL 以插入数据库吗?但是,如果 BLL 和 DAL 对 Student 类一无所知,那怎么可能呢?

如果不创建循环依赖项,我不明白这如何工作。有人可以解释或提供代码示例吗?

提前谢谢你。

【问题讨论】:

为什么模型不能被所有项目引用。是因为您在 MVC Web 应用程序中定义它吗?你能把你的模型对象分成一个包含 MVC 和层引用的普通旧 .Net 类的程序集吗? @Braim 正确,我在 MVC Web 应用程序的 Models 文件夹中定义模型。我想我可以在单独的类库中定义模型,但这是标准约定吗? 我还看到人们使用在控制器和业务逻辑之间引入的“数据映射器”。但这并没有让它变得更好,因为要么必须根据约定(名称)/XSD/映射配置来完成映射,要么会形成类似形式的依赖关系。 【参考方案1】:

我认为您对 MVC 的想法通常是正确的,尽管对于为什么会得到循环依赖有点令人困惑。从你的解释中我可以看到:

M(型号) StudentViewModel (位于 MVC 应用项目中)

V(视图) Create.cstml(模型是 StudentViewModel)(存在于 MVC 应用项目中)

C(控制器) 使用 StudentViewModel 导航到 CreatePage(位于 MVC 应用项目中)

当控制器执行 Post 时,您会将填充的 StudentViewModel 注入您的方法中,这就是可能发生的情况:

您只需调用 StudentViewModel.Save(...) (MVC 应用项目) 视图模型中的 save 方法可以创建 BLL 的实例并执行必要的操作 在 BLL 中,您可以使用您拥有的信息创建您的学生(实际实体)并通过调用 DAL 来保存该项目

所以你最终会得到一个像这样的依赖图

MVC 应用引用 BLL 引用 DAL 引用实体层。

还有很多其他方法可以使用依赖注入等使上述结构更好,但这至少应该回答一些问题(并创建很多其他问题):)

【讨论】:

"DAL 引用实体层" 所以从你所说的听起来,实际的学生实体/类需要驻留在一个单独的类库中,所有 3 都引用(直接或间接)层数? 不,我认为您仍在考虑公开 StudentEntity。我只会将其暴露给 DAL。 StudentEntity 和 StudentViewModel 是有区别的。仔细阅读答案:) 哦,我明白你现在在说什么了。我认为 ViewModels 的整个概念不知何故让我迷失了。非常感谢 - 这听起来是个不错的解决方案!

以上是关于如何将数据从表示层传递到业​​务逻辑层? (ASP.NET MVC 5)的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 作为 DAL 时如何传输数据?

我应该尝试将 asp 控制事件放入 BLL 中吗?

将数据访问逻辑从业务层移至数据访问层

如何将数据读取器值从 DAL 传递到表示层

技术平台研发目标

MVC设计模式与三层架构