簡體   English   中英

Play Framework 2.4 - 依賴注入以取代GlobalSettings.onStart()

[英]Play Framework 2.4 - Dependency injection to replace GlobalSettings.onStart()

我對依賴注入問題感到困惑。 我想要實現的是替換GlobalSettings.onStart()調用,我在2.3中初始化了一些靜態單例對象,並對這些對象進行了適當的依賴注入。

我想要做的是這樣的:

控制器 - >模型(將對象注入此模型)

到目前為止我所做的是一個中途措施; 在控制器中:

private static SomeObject myStaticSingletonObject = new SomeObject();

public Promise<Result> getSomeData() {
    return handleRequest(() -> new SomeDataAjaxRequest(myStaticSingletonObject));
}

public Promise<Result> handleRequest(Function0<AbstractAjaxRequest<?>> supplier) {
    Promise<AbstractAjaxRequest<?>> promise = Promise.promise(supplier);
    return promise.map(arg -> ok(arg.getResponse()));
}

handleRequest()是我使用的一個自定義方法,並沒有真正相關,但我將其包含在完整性中:

在模型中我只是把SomeObject作為一個參數:

private final SomeObject someObject;

public SomeDataAjaxRequest(SomeObject someObject) {
    super(null);
    this.someObject = someObject;
}

在我的build.sbt中我有:

routesGenerator := InjectedRoutesGenerator

所以基本上我的問題是我應該如何將SomeObject注入我的模型,以及我應該如何創建我的SomeObject對象,我不認為我應該使用new SomeObject()

理想情況下,我想對這些對象使用字段注入,因為我不想混淆構造函數,它可能實際上具有模型的相關參數,而不僅僅是包含事物定義的這些實用程序類(SomeObject基本上只是加載一些信息來自數據庫當前在應用程序的整個生命周期中都是靜態的,但可能會發生變化)。

另外值得注意的是,我打算使用Guice來管理DI。

我知道我應該創建一個Guice DI工廠並且已經看過這個文檔,但我仍然不確定如何將它集成到我的播放應用程序中。

您無需為此明確創建Guice DI工廠。

相反,創建一個模塊並使用它來配置任何綁定,並且 - 對您來說重要的是 - 替換onStart()

import play.api.inject.Module;

public class SomeModule extends Module {
    @Override
    public Seq<Binding<?>> bindings(final Environment environment,
                                    final Configuration configuration)
    {
        return seq(bind(SomeObject.class).toSelf().eagerly());
    }
}

確保使用javax.inject.Singleton注釋SomeObject以確保其狀態。 模塊中eagerly的是確保盡早初始化對象。

然后, SomeObject將可用於DI,已被調用一次; 您可以使用構造函數初始化您需要做的任何事情。

要將此模塊公開給您的應用程序,請將其添加到application.conf

play {
  modules {
    enabled += "com.example.SomeModule"
  }
}

在您的控制器中,只需像往常一樣注入實例:

public class SomeController extends Controller {
    private final SomeObject someObject;

    @Inject
    public SomeController(final SomeObject someObject) {
        this.someObject = someObject;
    }

    public Promise<Result> getSomeData() {
        return handleRequest(() -> new SomeDataAjaxRequest(someObject));
    }

    public Promise<Result> handleRequest(Function0<AbstractAjaxRequest<?>> supplier) {
        return Promise.promise(supplier)
                      .map(arg -> ok(arg.getResponse()));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM