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

时间:2010-12-09 15:19:08

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

到目前为止,我还没有找到问题的答案,我想我必须在一段时间内提出第一个问题。到此为止。

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

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

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

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

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

,这可能会变得复杂

我可以从双方返回所有内容并在业务层中自己进行匹配,这似乎是很多额外的工作而且没有充分利用sql服务器。

我可以编写一个数据过滤界面,如果我的数据访问层发生了变化,那么这个层也必须改变。

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

1 个答案:

答案 0 :(得分:2)

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

  • 数据中心就像CRUD和其他常见的/显而易见的东西一样毫无疑问。
  • “用例”中心是您为特定目的定义接口和匹配POCO的地方。 [我可能在这里缺少一些常用的术语,但我的意思是使用案例中心]

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

猫和狗应该互相了解吗?如果它们存在于同一个域模型中,并且已在该模型中建立了关系 - 那么您当然可以进行GetCatPeople()之类的查询。

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