已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
2天前关闭。
Improve this question
我想听听你对这种情况的看法,代码很简单,应该很容易遵循:
@Component
class MyService {
AusiliaryService ausService;
public MyService(AusiliaryService ausService) {
...
}
public boolean isAccountValid(Account account) {
AccountValidator accountValidator = new AccountValidator(account);
boolean isValid = accountValidator.isValid(account);
if(isValid) {
ausService.openAccount(account);
}
}
}
注意AusiliaryService
也是spring管理的,我们使用的是构造函数注入。
在这个类中,AccountValidator
是MyService
的依赖项,但它没有出现在构造函数中,所以我们可以说这个依赖项的可见性以某种方式隐藏。
由于我们是硬编码AccountValidator accountValidator = new AccountValidator(account);
我们在编写单元测试MyService
时也可能有一些潜在的问题,除非你认为这样的任何单元测试也应该影响AccountValidator
,这对我来说是一个有效的思路。
解决这两个“问题”的一个可能的方法是使用工厂,从MyService中删除示例化AccountValidator
对象的责任。
@Component
class MyService {
AusiliaryService ausService;
AccountValidatorFactory accountValidatorFactory;
public MyService(AusiliaryService ausService, AccountValidatorFactory accountValidatorFactory;) {
...
}
public boolean isAccountValid(Account account) {
AccountValidator accountValidator = accountValidatorFactory.getValidator(account);
boolean isValid = accountValidator.isValid(account);
if(isValid) {
ausService.openAccount(account);
}
}
}
请注意,AccountValidatorFactory
也是Spring管理的,我们使用的是构造函数注入。
如果在代码中经常使用这种模式,这种解决方案的一个缺点可能是这样的工厂类的激增。
在这种情况下,你的方法是什么?你更喜欢哪种解决方案?是否有可能使AccountValidator
也能帮助解决这个问题,那将如何做到?
1条答案
按热度按时间xqnpmsa81#
简单的答案是,你可以让
AccountValidator
成为一个托管的spring bean。你可以用创建这个类(MyService)的方式来实现这一点,或者你如何让你描述的工厂类托管-通过添加@Component。如果你需要保留语义,例如,如果这个bean不是线程安全的,你需要每次创建新的,你可以让它成为一个原型bean。
这里有一个例子,你可以看到它是以一种使用spring库而没有你自己的工厂的方式注入的。它将打印:
下面是代码: