我有一段代码,想将其重构为依赖注入风格。
它目前的样子是这样的:
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”本身会在“someMethod1/2”的开头执行“this.setAccount(account)”,或者它可以让每个方法都没有副作用,这意味着它实际上没有任何状态。这听起来还不错,但我感觉自己可能误解了某些东西。
我认为最符合习惯用法的做法应该是:
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
中实际执行此操作。任何指针都将不胜感激。