S#arp架构:在哪里放置这个域逻辑

时间:2011-02-06 20:09:15

标签: c# business-logic s#arp-architecture

re:S#arp Architecture

关于在哪里使用S#arp放置某些域逻辑的一些菜鸟问题。好的,想象一下这个域规则:

  

当按名称要求特定聊天室时,如果房间已经存在则返回房间,或者创建一个具有该名称的新房间并将其返回。

这是域逻辑吗?在这种情况下,我如何在我的Entity对象中实现它(因为我似乎需要访问存储库来执行它)

这是控制器逻辑吗?在这种情况下,我想我会把它放在MVC控制器中,这很容易。

这是数据访问逻辑吗?在这种情况下,我将它构建到Repository对象中,Contoller将其调用。再一次,很容易。

我认为这是域逻辑,但后来我不确定如何将它构建到我的实体中。由于实体似乎无法访问存储库(或者我错过了什么?)。

1 个答案:

答案 0 :(得分:3)

从你描述它的方式来看,我认为最好进入Application Services层。 (WhoCanHelpMe?示例项目中的Tasks层)。对我来说,这是应用程序逻辑而不是域逻辑。

对于其他选项:

  • Sharp是专门设计的,因此实体不会访问存储库。 (你会发现很多关于为什么实体应该是持久性 - 无知的文章。)
  • 一般来说,控制器并不是真正意味着直接包含任何业务逻辑 - 可读性,可测试性等。(我个人觉得最初将逻辑放在那里,然后重构它。)

将逻辑直接放入存储库中我感到不舒服的一个原因是清晰度。如果您在IChatRoomRepository上有方法:

ChatRoom GetRoomByName (string name);
ChatRoom GetRoomById (int id);

如果给定的id没有空间,通常GetRoomById将返回null,所以如果你还没有一个房间,那么第一个方法会默默地创建(并且可能会持续存在?)并不是很明显。

更概念上,来自DDD Quickly(p56):

  

我们不应该将Repository与Factory混合使用。工厂应该创造新的   对象,而存储库应该找到已经创建的对象。当一个   要将新对象添加到存储库,应首先创建它   使用工厂,然后它应该被提供给存储库

这表明如果您尝试实现存储库模式,则应在存储库外部创建新的聊天室。