在DI框架中从"上帝"对象中提取依赖关系

ICR*_*ICR 5 java dependency-injection guice god-object

我有一个拥有大量现有代码的Servlet.我正在尝试将依赖注入添加到其中的一部分.目前我手动完成:

public class AdjustBookPriceHandler extends BookRequestHandler {
    @Override
    public void handleRequest(RequestState requestState, RequestData requestData, Object obj) {
        Book book = (Book) obj;
        long newPrice = Long.parseLong(requestData.getQueryParam("price");
        OfferRepository offerRepository = ((BookData) requestState.getData()).getOfferRepository();

        BookPriceAdjuster priceAdjuster = getBookPriceAdjuster();
        priceAdjuster.adjustPrice(newPrice);
    }

    protected BookPriceAdjuster getBookPriceAdjuster(RequestState requestState, RequestData requestData, Book book) {
        return new BookPriceAdjuster(book, offerRepository);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里通过构造函数将书和提供存储库依赖项注入BookPriceAdjuster.getBookPriceAdjuster方法允许从AdjustBookPriceHandler继承的类提供不同的价格调整器.

我想开始使用像Guice这样的DI框架来减少复杂示例所引入的一些样板代码.但是,我不确定在这种情况下使用它的最佳方法.

如何编写从"神"对象RequestState和RequestData中提取相关依赖关系的绑定?或者在这一点上使用框架就像复杂和混乱一样?

Mar*_*zar 0

我不确定我是否正确理解你想要做什么。这本书是请求范围的,而 OfferRepository 是单例范围的?如果是这样你可以做这样的事情..

public class AdjustBookPriceHandler extends BookRequestHandler {

    // inject concrete instance with setter or constructor
    private BookPriceAdjusterProvider bookPriceAdjusterProvider;

    @Override
    public void handleRequest(RequestState requestState, RequestData requestData, Object obj) {
        Book book = (Book) obj;
        long newPrice = Long.parseLong(requestData.getQueryParam("price");

        BookPriceAdjuster priceAdjuster = bookPriceAdjusterProvider.getBookPriceAdjuster(book);
        priceAdjuster.adjustPrice(newPrice);
    }

}

public interface BookPriceAdjusterProvider {

    BookPriceAdjuster getBookPriceAdjuster(Book book);

}

public class MyBookPriceAdjusterProvider {

    // inject this through setter or constructor
    private OfferRepository offerRepository;

    protected BookPriceAdjuster getBookPriceAdjuster(Book book) {
        return new BookPriceAdjuster(book, offerRepository);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就摆脱了单例范围的 OfferRepository,并可以使用一些 DI 框架来为您进行注入。如果您的子类等需要,您也可以使用 BookPriceAdjusterProvider 的不同实现。这是你想要的还是我完全误解了你的目标?