在存储库类中实现查找(或搜索)方法时,最好是接受域模型还是更好地实现特定的查找方法?
例如,我们有一个Person
类,其属性为name
,id
。
在存储库中,我们可以使用find
方法接受一个人作为参数。该方法将使用给定的模型来搜索现有人员。
另一种方法是为每个属性(find_by_name
,find_by_id
)实现一个查找方法。
由于我将在Python中实现它,我还可以实现一个接受关键字的方法。这将类似于接受模型方法:find(name='harry')
作为一个附带问题,当find方法涉及索引值(id
)时,使用get_by_id()
(表示索引)或find_by_id()
(更抽象)更好吗? )。
答案 0 :(得分:1)
我个人会实现特定的查找方法。存储库是持久性机制的集合式抽象,其接口应该用域的语义编写。
虽然find_by_name
或find_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);