在业务层过滤数据访问层的结果

问题描述 投票:0回答:1

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

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

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

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

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

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

我可以从两边都返回,然后自己在业务层进行匹配,这看起来是很多额外的工作,并且没有充分利用SQL服务器。

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

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

database design-patterns architecture n-tier-architecture
1个回答
2
投票

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

  • 以数据为中心是像 CRUD 和其他常见/明显的东西,这是理所当然的。
  • 以“用例”为中心,您可以为特定目的定义接口并匹配 POCO。 [我可能在这里遗漏了一些常见术语,但我的意思是以用例为中心]

我认为这两种类型都是有效的。对于用例驱动的用例,它将主要由以业务为中心的用例驱动,但我可以看到它们可以更加技术驱动的边缘情况 - 我想说只要它们不违反任何业务规则就可以或者破坏你的领域模型。

猫和狗应该互相了解吗?如果它们存在于同一域模型中,并且在该模型中建立了关系 - 那么是的,您当然应该能够进行像

GetCatPeople()
这样的查询。

就管理复杂性而言,您可以使用一种更通用的方法,将属性作为参数:

GetCatPeople()
,而不是
GetPeopleByAnimal(animal)

© www.soinside.com 2019 - 2024. All rights reserved.