Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 存储库、服务或域对象-逻辑属于哪里?_Oop_Domain Driven Design_Repository Pattern_Business Logic - Fatal编程技术网

Oop 存储库、服务或域对象-逻辑属于哪里?

Oop 存储库、服务或域对象-逻辑属于哪里?,oop,domain-driven-design,repository-pattern,business-logic,Oop,Domain Driven Design,Repository Pattern,Business Logic,举一个简单、人为的例子: UserRepository.GetAllUsers(); UserRepository.GetUserById() 不可避免地,我会有更复杂的“查询”,例如: //returns users where active=true, deleted=false, and confirmed = true GetActiveUsers(); 我很难确定存储库的责任在哪里结束。GetActiveUsers()表示一个简单的“查询”。它属于存储库吗 有点逻辑的东西怎么样,比如

举一个简单、人为的例子:

UserRepository.GetAllUsers(); UserRepository.GetUserById()

不可避免地,我会有更复杂的“查询”,例如:

//returns users where active=true, deleted=false, and confirmed = true
GetActiveUsers();
我很难确定存储库的责任在哪里结束。GetActiveUsers()表示一个简单的“查询”。它属于存储库吗

有点逻辑的东西怎么样,比如:

//activate the user, set the activationCode to "used", etc.
ActivateUser(string activationCode);

这些都是很好的问题。能够决定你应该使用哪种方法取决于你的经验和你正在解决的问题

我建议读一本像福勒的书。在这本书中,他讨论了你提到的模式。最重要的是,尽管他给每个模式分配了一个责任。例如,域逻辑可以放在服务层或域层中。每种方法都有利弊

如果我决定使用服务层,我会将处理事务和授权的角色分配给该层。我喜欢保持它的“瘦”和没有领域逻辑在那里。它成为我的应用程序的API。我将所有业务逻辑保留在域对象中。这包括对象的算法和验证。存储库检索并持久化域对象。对于简单系统,这可能是数据库列和域属性之间的一对一映射

我认为GetAtcitveUsers适合存储库。您不希望从数据库中检索所有用户并找出哪些用户在应用程序中处于活动状态,因为这会导致性能低下。如果ActivateUser具有您建议的业务逻辑,那么该逻辑属于域对象。保存更改是存储库层的责任


希望这有帮助。

存储库负责特定于应用程序的对象集处理。这自然包括查询和集合修改(插入/删除)


ActivateUser
对单个对象进行操作。需要检索该对象,然后对其进行修改。存储库负责从集合中检索对象;另一个类将负责调用查询和使用对象。

在构建DDD项目时,我想区分两种职责:存储库和查找器

存储库负责存储聚合根并检索它们,但仅用于命令处理。通过命令处理,我指的是执行用户调用的任何操作

Finder负责为UI查询域对象,如网格视图和详细视图


我不认为发现者是领域模型的一部分。特定的IXxxFinder接口位于表示层,而不是域层。IXxxRepository和IXxxFinder的实现都放在数据访问层中,甚至可能放在同一个类中。

回应您的最后一段:如果“持久化更改”是唯一的逻辑怎么办。e、 g.ActivateUser()只更新用户表中的一条记录和ActivationCode表中的一条记录。这是否构成“逻辑”?如果没有,那是什么?