用于分离数据访问、业务逻辑和表示的简单优雅模式

Posted

技术标签:

【中文标题】用于分离数据访问、业务逻辑和表示的简单优雅模式【英文标题】:Simple Elegant pattern to separate Data Access, Business logic and presentation 【发布时间】:2010-10-17 22:16:08 【问题描述】:

我需要一个简单的模式来完成上述操作。 有几点需要注意:

1) 我有一个我必须使用的类来进行实际数据检索并返回 DataTable

2) 我不关心支持所有可能的数据库类型的通用接口,我们坚持使用一种数据库类型。

3) 我如何优雅地捕获错误并通知用户发生了错误。

4) 不要让我学习 MVC - 现在不是一个选择。

我对实际的图案设计感兴趣。

【问题讨论】:

"我需要 MVC,但不要告诉我使用 MVC 模式!" 楔子,请在评论之前阅读我的 cmets 的答案。 【参考方案1】:

有许多模式可以接近您所描述的。我建议购买 Martin Fowler 的优秀著作 Patterns of Enterprise Architecture 的副本,特别是第 14 章。Web Presentation Patterns。 您会发现任何将表示、域分开的认真尝试(业务逻辑),数据源将引导您找到同一主题的许多变体之一。

MVC、MVP、可视化代理等都分为三层,不同的是每一层的职责以及各层之间的通信方式。

例如,Passive View 模式基本上剥离了 UI 层中与展示不直接相关的任何内容。如果某个条件为真,则典型示例是您要突出显示的字段。在被动视图中,表单只包含确定是否应突出显示该字段的逻辑。触发此状态的业务规则将位于不直接依赖于实际视图的演示者/控制器层中。

就数据源层而言,主要好处是无法立即切换数据库。主要好处是对数据库模式的更改只会影响数据源层,不会扩展到应用程序的其余部分。如果您坚持使用数据集,一个好方法是 Table Data Gateway 模式。

【讨论】:

【参考方案2】:

不要让我学习 MVC - 现在不是一个选择。

您可以在不使用 ASP MVC 框架的情况下创建简单的 MVC 或 MVP 模式。介绍起来很简单。这是一个非常简单的例子MVP Example

【讨论】:

【参考方案3】:

您想使用MVC 模式将业务逻辑与表示分离(注意我不是在谈论ASP.NET MVC Framework)和DAO 模式将业务逻辑与数据分离访问。

返回 DataTable 的类成为模型的一部分。您编写了一个层(每个域对象的 DAO),它获取您的 DataTable 并将其转换为您的各种域对象。您的 UI 不应包含任何除了向用户呈现输出之外的逻辑;从模型中检索数据的任何实际逻辑都在控制器层中处理,该层获取用户从模型中请求的数据并将其发送到适当的视图以将其呈现给用户。

应在层边界处理异常;要么捕获并处理它(可能只是记录它并将用户发送到错误页面),要么在适当的情况下包装更高级别的异常。

【讨论】:

我熟悉 MVC。但是,由于当前的站点设计,我宁愿只是分离图层而不是进入完整的 MVC 模式 我想我不太确定你的意思。我不确定您如何在不创建某种 MVC 架构的情况下将业务逻辑与表示分离。 我正在寻找的是一种松散耦合的方法,例如 n 层。 N 层架构是客户端层从不直接与数据层通信;所有通信都通过中间层。在 MVC 中,视图向控制器发送更新,控制器更新模型,视图直接从模型中更新。 我正在寻找的是一个简单的代码示例,例如 Person 类,据我了解,您拥有:Person 类(代表业务逻辑)、PersonDAL(完成所有数据库工作)。 UI 将与 Person 类对话,而 Person 类将与 PersonDAL 对话。

以上是关于用于分离数据访问、业务逻辑和表示的简单优雅模式的主要内容,如果未能解决你的问题,请参考以下文章

浅谈命令查询职责分离(CQRS)模式

浅谈命令查询职责分离(CQRS)模式

S2/JAVA/09-数据访问层

浅谈针对DELPHI的界面和业务的分离开发模式和MVC模式

使用三层架构处理业务

外观模式