2014-02-13 26 views
0

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

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

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

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

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

作为一个方面的问题,当find方法涉及的索引值(id),是它更好地使用get_by_id()(这意味着索引)或find_by_id()(这是更抽象)。

+0

为什么如果你已经拥有'Person'并且可以将它作为参数传递给存储库查询函数,你需要查询'Person'? –

+0

@AlexanderLanger给定的'Person'实例是部分的。例如,只有'id'属性可以在部分实例中设置,结果将是一个单独的'Person'实例,同时设置'name'和'id'。 – siebz0r

回答

0

如果没有很多特定的查询需求,使用findBy(属性)在语义上更可取,更有意义。

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); 
+0

将标准对象声音中的查询语法抽象为实体设计。然而,这些标准的需求在@StevePuder的解答中得到了解释。如果只有我可以接受这两个答案。 – siebz0r

1

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

尽管像find_by_namefind_by_id查询是有效的,很多时候一个需要的类型find_vip_persons的查询其可以是Person聚合根(例如salary > 10000 & age > 21)的几个性质的组合。特别是在像这样的情况下,我会避免使用通用查询方法,因为域逻辑(即使某人成为VIP的原因)很容易在您的代码库中随处散布。

虽然我对Pythons关键字的参数不是很熟悉,并且在这里可能是错误的,但我会假设您正在考虑的'accept-a-model approach'不允许更复杂的条件,如VIP示例无论如何(即比较运算符)。

如果要使用通用存储库接口并在域中的不同位置重新使用查询,则应该查看'Specification Pattern'。

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

+0

非常好的例子指出了复杂的查询,我完全忘记了那些。不幸的是,Python的关键字参数不支持其他操作符,这不是它本来打算的。我确实认为由于采用标准方法,我必须去寻求其他答案。虽然答案很好。 – siebz0r

相关问题