疑惑springmvc

Doubts spring mvc

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

1:我不想要贫血模式,所以我没有一个整体服务,其中所有服务都相互调用,但这些服务仅与存储库实例化实体通信,我在其中放置了业务逻辑,正确?

2: 转换函数entitiy->dto放在哪里?我读到有人将它们放在控制器中,其他人放在服务中,其他人放在同一个域中..目前最干净的解决方案,我更喜欢有一个借给实体输入的 DTO 生成器,好吧我有禁忌症?

3: 多态性和继承性:我有一项服务根据相关实体的属性组成一些菜单级别。我不想在任何地方使用 if 块,我希望能够将这个逻辑放在一个点上,实例化正确的 class (我不知道先验)并利用多态性,如何我可不可以做?考虑涉及服务、实体和相关逻辑..

非常感谢

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

但是要回答你的问题:

  1. 根据您的模型的复杂程度和相互关联程度,有不同的选择,对于模型中实体之间没有很大相互依赖关系的情况,3 层方法简单且足够好,但是如果您的模型比较复杂,你可以看看Aggregates的概念,把不变量藏在里面。
  2. 以Entity为参数构建DTO是一个很好的解决方案,每当需要对DTO或Entity进行更改时,维护的代码量不像其他方法那么多,它不是只是关于转换代码,它也关于方法签名和所有用法。这种方法也遵循 Dependency Inversion principle,其中指出低级模块(在本例中为表示)应依赖于高级策略(业务逻辑),而不是相反。 但这不是唯一有效的解决方案,它始终取决于您的具体情况。
  3. 如果你想 return 服务中的一个对象可以是不同类型的实例,有不同的方法可以做到这一点,一种方法(但不是只有一个,最好的方法总是取决于您的具体情况):

    • 对于类型控制,一种选择是使方法 return 键入一个接口,然后可以 return 编辑可能的不同对象以扩展该接口。
    • 对于不同对象的构造,如果那是您要使用它的唯一地方,或者如果您要在更多地方使用它,您可以将它封装在服务内部的私有函数中,然后您可以将其提取到工厂并将其用作服务的合作者。对于构造,你将无法避免 if 检查,但在服务之外,一旦你为不同的实例提供服务,那么你将不需要做更多的 if 检查。
    • 最后在服务中 return 你构造的实例,因为它实现了接口,编译器仍然会很高兴。

希望对您有所帮助!