gpt4 book ai didi

java - 重构依赖注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:03 27 4
gpt4 key购买 nike

我有一段代码想重构为依赖注入(inject)样式。

目前看起来是这样的:

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
}

一种方法是注入(inject) 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 而不会出现问题,因为之前的服务方法设置了它(除非您当然指定它应该是原型(prototype)范围的,但仍然如此。 .. 看起来很奇怪)。

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);
}
}

这只会将问题推送到 AccountHandlerAccountHandler 本身会在 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 中执行此操作。任何指针将不胜感激。

最佳答案

您可以注入(inject)一个具有 createAccountHandler(Account) 方法的 AccountHandlerFactory,而 AccountHandlerFactory 将是一个无状态的单例,而您的 AccountHandlers 将是有状态的单一对象。

关于java - 重构依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23082781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com