我正在构建一个Spring应用程序,在这个应用程序中,每个实体(人)都可以执行3项任务,比如走路、交谈和思考。
因为它们都是某种人的功能,所以我正在考虑制作一个接口Capability.java,它将有一个方法performTask()。
上面的3个类将实现Capability.java &还将有自己的一组其他特定方法。
既然这三个类都是动词,我就把它们做成@Service,即
另外,我正在考虑创建一个@Controller - PersonController,它将调用这3个类的performTasks()。
要在PersoneController中使用这些类,我必须对它们进行自动测试。作为一种普遍的实践,我们应该始终使用@Autowire接口。
但是在这里,这3个类有一个公共接口,我无法用它调用控制器中所有3个服务的performTaks()。
所以,我的问题是,我应该做什么(A或B)?
另外,制作三个独立的接口,即。WalkService, TalkService & ThinkService,它在控制器中扩展了Capability.java和自动生成这些类?
在控制器中直接自动生成WalkServiceImpl, TalkServiceImpl & ThinkServiceImpl?
发布于 2016-09-03 20:37:56
如果您连接了一个bean的接口,您就会有效地说,您希望只存在一个实现--或者配置解决了问题并留给了您一个主候选。显然,这不是你想要的。
如果你问我,明确连接这三种服务的想法是值得怀疑的。如果你已经知道在设计的时候,会有什么特定的服务,为什么要自动装配呢?然后,您可以硬编码,并完成它。自动装配是伟大的,如果你想放弃控制的细节。使用自动装配,但强迫它做一件非常具体的事情.不是很有用。
所以,不,如果有很多能力--想想未来,也许人们也会游泳,开车,跳……-那么,你也许应该尝试的是制造一些工厂,可以生产任何类型的能力--或者更好的,从Spring获得所有可用的能力。
为什么不直接连接实现接口的所有bean的列表呢?
@Autowired
private Set<Capability> capabilities;然后工厂(或个人,或其他什么)可以访问所有存在的功能。也许这些能力有某种方式来检查他们申请的人?
当然,@Buhb所说的很可能是真的,听起来像是一个设计过度的可怕的解决方案,但是很明显,我们正在谈论一些游戏,所以为什么不呢?
https://stackoverflow.com/questions/39310400
复制相似问题