我当前正在编写我的第一个Spring应用程序(Spring Boot +休眠)。我在他们的文档here中检查了最佳做法目录结构。这说得通。
问题1:
我有一个扩展了几个子类的interface
(或Abstract class
),所以对于父类,我只需要一个@Repository
。我决定这样做:
com
+- example
+- myapplication
+- Application.java
|
+- message
| +- AbstractMessage.java
| +- IMessageRepository.java
| +- MessageRepositoryImpl.java
+- messageTypeA
| +- messageTypeA.java
| +- messageTypeAService.java
+- messageTypeB
| +- messageTypeB.java
| +- messageTypeBService.java
问题2:
现在我有一个新的entity
要保存,名为Group
。因此,我可以做的是在与Group
相同级别上添加一个Message
目录。但是,此Group
实际上是Message
的一部分(就像逻辑上一样),因此,如果它是同一message
目录的一部分,则实际上是有意义的(唯一原因我们之所以将它们保存为不同的实体,是因为以这种方式导出分析更有意义)。此外,我什至使用相同的MessageRepository
保存它(我只是在界面中添加了第二种方法,如下所示:)
public interface MessageRepository {
void insert(AbstractMessage message);
void insert(AbstractMessage message, AbstractGroup group);
}
像下面这样的东西好吗?还是每个 entity
都有自己的软件包?我在想这个吗?
com
+- example
+- myapplication
+- Application.java
|
+- message
| +- AbstractMessage.java
| +- IMessageRepository.java
| +- MessageRepositoryImpl.java
| +- messageTypeA
| +- messageTypeA.java
| +- messageTypeAService.java
| +- messageTypeB
| +- messageTypeB.java
| +- messageTypeBService.java
|
+- group
+- AbstractGroup.java
+- GroupTypeX.java // same service as message, just different entity
+- GroupTypeY.java // same service as message, just different entity
答案 0 :(得分:2)
这更多是基于观点的,但是我想给您一些建议。
首先,命名。
接口上的I
前缀是IBM识别它们的“古老”技术。拜托,不要那样做,它是多余的,在新鲜的环境中没有意义。什么是I-MessageRepository
?!
您会在Eclipse RCP
项目或IBM的任何产品中找到这种命名约定。
然后是实现名称。不要使用后缀Impl
,它不会对正在阅读或编辑您的代码的人说任何话。
给它起个名字,说明它的用途或领域范围。
ActiveMQMessageRepository
FileMessageRepository
TcpMessageRepository
第二,Repositories
。
存储库应管理一种类型的对象,但不能超过一种。使用Services
来协调多个Repositories
。这将使每个人都更容易调试,并且将使许多代码分离。
第三,packages
。
尝试始终保持扁平的包装结构。扁平结构更易于维护,更易于观察,更易于理解。不要创建数十个子包,例如
- messages
- services
MessageService
- implementations
...
- repositories
MessageRepository
- abstract
AbstractMessageRepository
- implementations
TextMessageRepository
- exceptions
- runtime
- checked
UnsupportedMessageException
可怕而无用。而且您无法利用软件包的可见性。
因此,将messages
和groups
放在单独的包装上,并给它们自己的Repository
。
从包公开接口,而不是具体的实现。(如果可能)
答案 1 :(得分:0)
我同意上面的@LppEdd答案。只是一个问题,你说什么意思
(将它们保存为不同实体的唯一原因是,以这种方式进行分析更有意义)。