关于在哪里使用S#arp放置某些域逻辑的一些菜鸟问题。好的,想象一下这个域规则:
当按名称要求特定聊天室时,如果房间已经存在则返回房间,或者创建一个具有该名称的新房间并将其返回。
这是域逻辑吗?在这种情况下,我如何在我的Entity对象中实现它(因为我似乎需要访问存储库来执行它)
这是控制器逻辑吗?在这种情况下,我想我会把它放在MVC控制器中,这很容易。
这是数据访问逻辑吗?在这种情况下,我将它构建到Repository对象中,Contoller将其调用。再一次,很容易。
我认为这是域逻辑,但后来我不确定如何将它构建到我的实体中。由于实体似乎无法访问存储库(或者我错过了什么?)。
答案 0 :(得分:3)
从你描述它的方式来看,我认为最好进入Application Services层。 (WhoCanHelpMe?示例项目中的Tasks层)。对我来说,这是应用程序逻辑而不是域逻辑。
对于其他选项:
将逻辑直接放入存储库中我感到不舒服的一个原因是清晰度。如果您在IChatRoomRepository上有方法:
ChatRoom GetRoomByName (string name);
ChatRoom GetRoomById (int id);
如果给定的id没有空间,通常GetRoomById将返回null,所以如果你还没有一个房间,那么第一个方法会默默地创建(并且可能会持续存在?)并不是很明显。
更概念上,来自DDD Quickly(p56):
我们不应该将Repository与Factory混合使用。工厂应该创造新的 对象,而存储库应该找到已经创建的对象。当一个 要将新对象添加到存储库,应首先创建它 使用工厂,然后它应该被提供给存储库
这表明如果您尝试实现存储库模式,则应在存储库外部创建新的聊天室。