database - 在业务层过滤来自数据访问层的结果

标签 database design-patterns architecture n-tier-architecture

到目前为止,我还没有找到我的问题的答案,我想我必须找个时间问我的第一个问题。开始吧。

我有一个数据访问层,负责与各种数据存储元素交互,并在查询事物时返回 POCO 或 POCO 集合。

我有一个位于此之上的业务层,负责对从数据访问层返回的对象实现业务规则。

例如,我有一个狗的 SQL 表,我的数据访问层可以将该狗列表作为 Dog 对象的集合返回。然后我的业务层会做一些事情,比如过滤掉特定年龄以下的狗,或者任何其他必须根据业务规则发生的过滤或转换。

我的问题是这样的。根据相关记录处理过滤对象的最佳方法是什么?假设我想要所有拥有猫的人。现在我的数据访问层可以返回所有的猫和所有的人,但不为我做任何过滤。

我可以通过不同的数据访问方法(即 DAO.GetCatPeople())实现过滤,但如果我有大量相关属性或关系要处理,这可能会变得复杂

我可以从两边返回all,然后在业务层自己匹配,这看起来额外工作很多,并没有充分利用sql server。

我可以编写一个数据过滤接口(interface),如果我的数据访问层发生变化,则该层也必须发生变化。

这里有一些我可以从中受益的已知最佳实践吗?

最佳答案

我的观点是,您访问数据有两个“原因”:以数据为中心和以用例为中心。

  • Data Centric 是诸如 CRUD 之类的东西和其他常见/显而易见的东西,无需动脑筋。
  • 以“用例”为中心是您为特定目的定义接口(interface)和匹配 POCO 的地方。 [我可能在这里遗漏了一些常用术语,但我的意思是以用例为中心]

我认为这两种类型都有效。对于用例驱动的,它将主要由以业务为中心的用例驱动,但我可以看到它们可以更多地由技术驱动的边缘案例——我认为只要它们不违反任何业务规则就可以或扭曲你的领域模型。

猫和狗应该互相认识吗?如果它们存在于同一个域模型中,并且已经在该模型中建立了关系 - 那么是的,当然你应该能够进行类似 GetCatPeople() 的查询。

就管理复杂性而言,除了 GetCatPeople() 之外,您还可以使用将属性作为参数的更通用的方法:GetPeopleByAnimal(animal)

关于database - 在业务层过滤来自数据访问层的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399783/

相关文章:

java - 如何从文件中选择文本

architecture - 什么是 "feature flag"?

c# - 架构 Azure 辅助角色以处理来自约 10 个队列的数据的最佳方法

java - 如何使用 hibernate CRITERIA 编写此连接查询

ios - 如何设计一个带有复杂 TableView 的 ViewController

mysql - 通过 phPMYadmin 查询 WordPress 的链接文本

c# - 这里的 new() 函数是什么?

javascript - Backbone - 将模型更改保存到本地对象

php - 查询SQL多表

mysql - 是否有可能有一个 NOT NULL 的外键指向 MySQL 数据库中的任何行?