Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/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
Java 质疑春季mvc_Java_Spring_Spring Mvc_Polymorphism_Dto - Fatal编程技术网

Java 质疑春季mvc

Java 质疑春季mvc,java,spring,spring-mvc,polymorphism,dto,Java,Spring,Spring Mvc,Polymorphism,Dto,我正在开发一个Spring Boot MVC应用程序,在阅读了许多指南和评论之后,我仍然有一些疑问,我没有取消标记 1:我不想要一个贫乏的模式,所以我没有一个单一的服务,其中所有的服务都是相互调用的,但是这些服务只与存储库实例化实体通信,我把业务逻辑放在其中,对吗 2:转换函数entitiy->dto放在哪里?我读到有人将它们放在控制器中,其他人放在服务中,其他人放在同一个域中。。目前,这是最干净的解决方案,我更喜欢有一个DTO的构建器来提供实体输入,好吗?我有禁忌症吗 3:多态性和继承性:我有

我正在开发一个Spring Boot MVC应用程序,在阅读了许多指南和评论之后,我仍然有一些疑问,我没有取消标记

1:我不想要一个贫乏的模式,所以我没有一个单一的服务,其中所有的服务都是相互调用的,但是这些服务只与存储库实例化实体通信,我把业务逻辑放在其中,对吗

2:转换函数entitiy->dto放在哪里?我读到有人将它们放在控制器中,其他人放在服务中,其他人放在同一个域中。。目前,这是最干净的解决方案,我更喜欢有一个DTO的构建器来提供实体输入,好吗?我有禁忌症吗

3:多态性和继承性:我有一个服务,它根据相关实体的属性组成一些菜单级别。我不想在任何地方都有if块,我希望能够将这个逻辑放在一个点上,实例化正确的类(我事先不知道),并利用多态性,我该怎么做?被认为涉及服务、实体和相关逻辑


非常感谢

您的问题更多地与软件设计相关,而不是特定于Spring框架。允许框架规定如何组织代码有一些缺点

但要回答你的问题:

  • 根据模型的复杂程度和相互关联程度,有不同的选项,对于模型中实体之间没有太大相互依赖性的情况,三层方法足够简单和好,但是如果模型更复杂,您可以研究的概念,并将不变量隐藏在其中
  • 使用实体作为参数构造DTO是一个很好的解决方案,每当需要对DTO或实体进行更改时,需要维护的代码量就没有其他方法那么多,这不仅仅是转换代码,还涉及方法签名和所有用法。这种方法还遵循了以下原则,即低级模块(本例中的表示)应该依赖于高级策略(业务逻辑),而不是相反但这不是唯一有效的解决方案,它始终取决于您的具体情况。
  • 如果您希望从服务返回一个对象,该对象可以是不同类型的实例,有不同的方法,一种方法(但不是唯一的方法,而且最好的方法总是取决于您的具体情况):

    • 对于类型控件,一个选项是将方法返回类型设置为接口,然后使用可能返回的不同对象来扩展该接口
    • 对于不同对象的构造,您可以将其封装在服务内部的私有函数中,如果这是您将要使用它的唯一位置,或者如果您将在更多位置使用它,那么您可以将其提取到工厂,并将其用作服务的协作器。对于构造,您将无法避免
      if
      检查,但是在服务之外,一旦您提供了不同的实例,那么您就不需要进行更多
      if
      检查
    • 最后,在服务中返回您构建的实例,当它实现接口时,编译器仍然会对此感到高兴

  • 希望有帮助

    对于第三点,我有一些想法,但没有一个我认为是非常好的。第三点,我不明白你想要实现什么,如果你能提供一个你打算做什么的例子,这将非常有助于理解控制器调用服务方法来填充特定级别的菜单。该服务是一个实体(实体运动),可以是4种不同的类型(实际上是属性类运动),该类型遵循不同的逻辑获取数据以返回控制器。现在,在我的服务中,if ent.is_type_1()。。如果ent.是_类型。。等等…我不想这样做,我更喜欢有一个类来管理正确的类(可能扩展Sport)到实例,然后使用多态性自动调用正确的方法。。。将if代码集中在一个独特的点上,我如何做到这一点以尊重体系结构规则MVC和OOP?如果你缩小问题的范围,你可能会得到更多的回答。你还想问一个具体的问题。你可能需要将这篇文章分成多篇文章。非常感谢。我试图更好地解释我在第三点中的意思。我希望这足够了,我想了解封装对象的正确方法,反映模式,尽可能利用代码的多态性、可维护性和可用性。。总的来说,我所期望的开发将是一个大项目,需要更多的人工作,并且需要很长时间(针对第1点、第2点,我已经猜到,在架构方面没有真正的解决方案,我有足够的时间来确认所做的工作的正确性)我试着用最好的方式来解释,如果我不知何故误解了什么,或者我遗漏了什么,让我知道,我会尽我所能再次回答,我想我已经理解了。我的错误是尝试使用泛型对象返回来返回不同的类。我不知道如何使用界面,但我正在寻找一个例子,现在我可以做你们写的。我尝试并将更新您的解决方案,非常感谢。请记住,使用服务的控制器只能看到接口,以及接口声明的方法,如果您返回的对象的方法比接口多,则它们将不可见,除非您强制转换到特定对象,因此,这与执行if检查相同。如果您认为自己处于这种情况,请重新考虑另一种设计选项,因为您增加了更多的复杂性,但没有获得多态性的好处。