到目前为止,我还没有找到我的问题的答案,我想我必须找个时间问我的第一个问题。开始吧。
我有一个数据访问层,负责与各种数据存储元素交互,并在查询事物时返回 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/