Domain driven design 查找方法中的域模型或基类型?

Domain driven design 查找方法中的域模型或基类型?,domain-driven-design,repository-pattern,Domain Driven Design,Repository Pattern,在存储库类中实现find(或search)方法时,接受域模型更好还是实现特定的find方法更好 例如,我们有一个属性为name,id的Person类 在存储库中,我们可以有一个find方法,该方法接受一个人作为参数。该方法将使用给定的模型来搜索现有的人 另一种方法是实现每个属性的查找方法(find\u by\u name,find\u by\u id) 因为我将在Python中实现它,所以我还可以实现一个接受关键字的方法。这类似于接受模型方法:find(name='harry') 作为附带问题,

在存储库类中实现find(或search)方法时,接受域模型更好还是实现特定的find方法更好

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

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

另一种方法是实现每个属性的查找方法(
find\u by\u name
find\u by\u id

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


作为附带问题,当find方法涉及索引值(
id
)时,使用
get\u by\u id()
(这意味着索引)还是
find\u by\u id()
(更抽象)。

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

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

虽然我不太熟悉Pythons关键字参数,这里可能会出错,但我认为您正在考虑的“接受模型方法”无论如何都不允许出现更复杂的情况,如上面的VIP示例(即比较运算符)

如果要使用通用存储库接口并在域中的不同位置重用查询,则应查看“”

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

使用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);

如果您已经有一个
,并且可以将其作为存储库查询函数的参数,那么为什么需要查询该
。例如,在部分实例中只能设置
id
属性,结果将是一个单独的
Person
实例,同时具有
name
id
集。非常好的示例指出了复杂的查询,我完全忘记了这些。不幸的是,Python的关键字参数不支持othet操作符,这根本不是它的初衷。因为克里特拉的方法,我确实认为我必须选择另一个答案。回答得不错。在criteria对象中抽象查询语法听起来像一个可靠的设计。然而,@StevePuder在回答中解释了这些标准的必要性。要是我能接受这两个答案就好了。