我有一段代码要重构成依赖注入样式。
目前看起来是这样的:

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将是有状态的,但是单个对象。

07-28 13:18