我应该在哪一层放置自定义存储库参数

In which layer should I put a custom repository parameter

我正在根据 DDD 开发应用程序。所以我在域层中有我的存储库的接口。

我的要求是制作一个searchByParams 方法。我的问题是:此方法将 DTO 作为参数是否正确? (因为我在this thread读到DTO应该在应用层)

这是一个示例,可以更好地说明我的问题:

我有一个模型对象让我们说 Person :

public class Person {
    private String firstName;
    private String lastName;
    private Date birthDate;
    private Date inscriptionDate;
    // Getters and setters ...
}

我想按名字、姓氏、birthDateBefore、birthDateAfter、inscriptionDateBefore、inscriptionDateAfter 获取人员列表。

我想做的是制作某种包含这些字段的 DTO

public class PersonDTO { // I can also name it PersonResearchFilters
    private String firstName;
    private String lastName;
    private Date birthDateBefore;
    private Date birthDateAfter;
    private Date inscriptionDateBefore;
    private Date inscriptionDateAfter;
    // Getters and setters ...
}

并将其传递给:List<Person> searchByParams(PersonDTO filters)

但这意味着我的 DTO 将在域层中。

你拥有的是一个没有行为的对象。

当应用层接收到来自客户端的命令并且returns向客户端发送结果时,没有行为的对象被称为 DTO(数据传输对象)。

在一个域中,您也可以拥有一个没有行为的对象。这通常被归类为值对象。值对象可以有行为但不需要。

对您的问题的简短回答是使用在您的域中声明的无行为对象来存储存储库查询的参数信息。

或者,您可能想要探索过滤查询的“规范模式”。

https://gunnarpeipman.com/ef-core-query-specification/