C# S#arp体系结构:将此域逻辑放在何处

C# S#arp体系结构:将此域逻辑放在何处,c#,business-logic,s#arp-architecture,C#,Business Logic,S#arp Architecture,关于: 一个关于如何使用S#arp将某些类型的域逻辑放在哪里的问题。好的,想象一下这个域规则: 当通过名称请求特定聊天室时,如果聊天室已经存在,请返回该聊天室,或者使用该名称创建一个新聊天室并返回该聊天室 这是域逻辑吗?在这种情况下,我如何在我的实体对象中实现它(因为我似乎需要访问存储库才能实现它) 这是控制器逻辑吗?在这种情况下,我想我会把它放在MVC控制器中,很简单 这是数据访问逻辑吗?在这种情况下,我将其构建到Repository对象中,然后控制器调用它。再说一次,很简单 我认为这是域逻辑

关于:

一个关于如何使用S#arp将某些类型的域逻辑放在哪里的问题。好的,想象一下这个域规则:

当通过名称请求特定聊天室时,如果聊天室已经存在,请返回该聊天室,或者使用该名称创建一个新聊天室并返回该聊天室

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

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

这是数据访问逻辑吗?在这种情况下,我将其构建到Repository对象中,然后控制器调用它。再说一次,很简单


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

从您描述的方式来看,我认为这最好是在应用程序服务层。(WhoCanHelpMe?示例项目中的任务层)。对我来说,这是应用程序逻辑,而不是域逻辑

对于其他选项:

  • Sharp是特意设计的,这样实体就不会访问存储库。(你会发现很多关于为什么实体应该是持久性无知的文章。)
  • 一般来说,控制器并不打算直接包含任何业务逻辑——为了可读性、可测试性等(就我个人而言,我很乐意一开始就把逻辑放进去,然后重构出来)
我不愿意将逻辑直接放在存储库中的一个原因是清晰。如果您在iChatromRepository上有方法:

ChatRoom GetRoomByName (string name);
ChatRoom GetRoomById (int id);
通常,如果给定id没有空间,则GetRoomById将返回null,因此,如果您还没有空间,那么第一个方法将以静默方式创建(并可能持续?)一个空间并不太明显

从概念上讲,来自(第56页):

我们不应该把存储库和工厂混为一谈。工厂应该创造新的环境 对象,而存储库应查找已创建的对象。当 要将新对象添加到存储库中,应首先创建它 使用工厂,然后应将其提供给存储库


这意味着,如果您试图实现存储库模式,则应在存储库之外创建新的聊天室。

我有一个您绝对没有想到的“答案”;让你的代码工作,然后移动那个,移动这个(当然有合理的意义)。谢谢,我出于某种原因忽略了应用程序服务层,因为我以前是尝试让所有域登录到域对象的粉丝。但这是有道理的,所以我会选择应用程序服务。