find方法中的域模型或基类型?

时间:2014-02-13 13:20:10

标签: domain-driven-design repository-pattern

在存储库类中实现查找(或搜索)方法时,最好是接受域模型还是更好地实现特定的查找方法?

例如,我们有一个Person类,其属性为nameid

在存储库中,我们可以使用find方法接受一个人作为参数。该方法将使用给定的模型来搜索现有人员。

另一种方法是为每个属性(find_by_namefind_by_id)实现一个查找方法。

由于我将在Python中实现它,我还可以实现一个接受关键字的方法。这将类似于接受模型方法:find(name='harry')

作为一个附带问题,当find方法涉及索引值(id)时,使用get_by_id()(表示索引)或find_by_id()(更抽象)更好吗? )。

2 个答案:

答案 0 :(得分:1)

我个人会实现特定的查找方法。存储库是持久性机制的集合式抽象,其接口应该用域的语义编写。

虽然find_by_namefind_by_id之类的查询有效,但通常需要find_vip_persons类型的查询,这些查询可能是Person聚合的多个属性的组合root(例如salary > 10000 & age > 21)。特别是在这些情况下,我会避免使用通用查询方法,因为域逻辑(即使人成为VIP的东西)很容易分散在代码库中的任何地方。

虽然我对Pythons关键字参数不是很熟悉,但在这里可能有问题,但我认为你正在考虑的'接受模型方法'不允许更复杂的条件,例如来自VIP的例子无论如何(即比较运营商)。

如果您想使用通用存储库接口并在域中的不同位置重用查询,那么您应该查看“Specification Pattern”。

关于你的“查找与获取”问题,我认为这并不重要。我可能会使用“查询”,但这只是个人偏好的问题。

答案 1 :(得分:0)

如果没有很多特定的查询要求,则使用findBy(attribute)在语义中是首选的,并且更有意义。

 personRepository.find_by_name(name); //is easy to read
 personRepository.find_by_age(age); //
 personRepository.find(person); //this one is at odds and confused

但是如果存储库中有太多特定的查询方法,那也很痛苦。在这种情况下,您需要一个标准。与现在使用find_by_person的方式非常相似,但在语义上更自然。

 criteria.nameEq = 'hippoom';
 personRepository.findBy(criteria);

 criteria.worksFor = 'XXX company';
 criteria.ageGt = 25
 personRepository.findBy(criteria);