我有一段代码要重构成依赖注入样式。
目前看起来是这样的:
class MyService {
public void A(Account account, String someparam1, int someparam2) {
AccountHandler myHandler = new AccountHandler(account);
// Do something with AccountHandler...
myHandler.someMethod1(someparam1);
myHandler.someMethod2(someparam2);
}
// Some more methods with same signature
}
一种方法是注入
AccountHandler
并为每个方法设置帐户:class MyService {
@Inject
AccountHandler myHandler;
public void A(Account account, String someparam1, int someparam2) {
myHandler.setAccount(account);
// Do something with myHandler
myHandler.someMethod1(someparam1);
myHandler.someMethod2(someparam2);
}
}
我觉得这很奇怪。
AccountHandler
是(或可能是)单体,但它仍有一些状态。理论上,在另一个方法中可能会“忘记”调用setAccount
而不出现问题,因为以前的服务方法设置了它(除非您当然指定它应该是原型范围,但仍然……看起来很奇怪)。class MyService {
@Inject
AccountHandler myHandler;
public void A(Account account, String someparam1, int someparam2) {
// Do something with myHandler
myHandler.someMethod1(account, someparam1);
myHandler.someMethod2(account, someparam2);
}
}
这只会将问题推到
AccountHandler
。要么AccountHandler
本身会在this.setAccount(account)
开始时做一个someMethod1/2
,要么它可以让每个方法都没有副作用,这意味着它实际上没有任何状态。听起来不错,但我觉得我好像误解了什么。我认为最惯用的是:
class MyService {
public void A(@Inject AccountHandler myHandler, String someparam1, int someparam2) {
// Do something with myHandler
myHandler.someMethod1(someparam1);
myHandler.someMethod2(someparam2);
}
}
其中
AccountHandler
类似于:class AccountHandler {
@Inject
Account account;
public void someMethod1(String someparam1);
public void someMethod2(int someparam2);
}
在调用
MyService
方法之前,我会将Account
放在IoC
-容器的作用域上。我不知道你在Java
中会怎么做。任何指点都非常感谢。 最佳答案
您可以注入一个具有createaccounthandler(account)方法的accounthandlerfactory,而accounthandlerfactory将是一个无状态的singleton,并且您的accounthandler将是有状态的,但是单个对象。