8

以这个简单的,人为的例子:存储库,服务或域对象 - 逻辑属于哪里?

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

回答

3

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

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

2

这些都是极好的问题要问。能够确定您应该使用哪些应用程序取决于您的经验和您正在处理的问题。

我建议读一本书,如福勒的patterns of enterprise architecture。在这本书中,他讨论了你提到的模式。最重要的是,尽管他分配了每种模式责任。例如域逻辑可以放在服务层或域层中。每个人都有优点和缺点。

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

我认为GetAtcitveUsers对于Repository是可以的。您不想从数据库中检索所有用户,并找出应用程序中哪些用户处于活动状态,因为这会导致性能下降。如果ActivateUser具有您所建议的业务逻辑,那么该逻辑属于域对象。坚持改变是Repository层的责任。

希望这会有所帮助。

+0

回应你最后一段:如果“坚持改变”是唯一的逻辑。例如ActivateUser()仅更新User表中的一条记录和ActivationCode表中的一条记录。这是否构成“逻辑”?如果不是,那是什么? – betitall 2010-06-06 01:46:14

2

在构建DDD项目时,我喜欢区分两个职责:存储库和查找工具。

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

Finder负责为用户界面查询域对象,如网格视图和详细信息视图。

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