如何在 Play! 的静态方法中使用 play.cache.CacheApi框架 2.4.2
How to use the play.cache.CacheApi in a static method in Play! Framework 2.4.2
我有一个游戏框架应用程序,我已将其迁移到 运行 游戏框架 2.4.2。它正在为 javascript/html 前端提供 RESTful API。现在引入缓存遇到了一些问题
LibraryController(将 JSON/HTTP 请求转换为 JSON/HTTP 响应):
public class LibraryController extends Controller {
public Result getBook(String isbn) {
Book book = LibraryManager.getBook(isbn);
BookDto bookDto = DtoMapper.book2BookDtos(book);
return ok(Json.toJson(bookDto));
}
}
LibraryManager(将域模型请求转换为域模型响应):
public class LibraryManager {
@Inject CacheApi cache;
public static Book getBook(String isbn) {
Book book = cache.get(isbn);
// ...
}
我这里的问题是我得到
non-static variable cache cannot be referenced from a static context
我注入缓存的方式与 Play 2.4.2 Cache API documentation. I didn't have this problem when I used caching as per the Play 2.2.x Cache API documentation 一致。那个版本有一个我可以调用的静态方法。
我该怎么办?我应该让 getBook 非静态应用一些单例模式吗?或者我应该以其他方式访问缓存吗?示例代码肯定会有所帮助!
使用 @Singleton
注释使 Guice
知道 LibraryManager
,从方法中删除 static 关键字并将它们拉到接口:
@ImplementedBy(LibraryManager.class)
public interface ILibraryManager {
//
}
@Singleton
public class LibraryManager implements ILibraryManager {
@Inject
private CacheApi cache;
@Override
public Book getBook(String isbn) {
Book book = cache.get(isbn);
// ...
}
}
现在您可以通过接口向您的控制器注入 LibraryManager
:
public class LibraryController extends Controller {
@Inject
private ILibraryManager libraryManager;
}
恭喜!您解耦 LibraryManager
并以适当的方式将其与 Play 2.4
集成。
在静态函数中获取 CacheApi.class 的实例。
public class LibraryManager {
public static Book getBook(String isbn) {
CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
Book book = cache.get(isbn);
// ...
}
我有一个游戏框架应用程序,我已将其迁移到 运行 游戏框架 2.4.2。它正在为 javascript/html 前端提供 RESTful API。现在引入缓存遇到了一些问题
LibraryController(将 JSON/HTTP 请求转换为 JSON/HTTP 响应):
public class LibraryController extends Controller {
public Result getBook(String isbn) {
Book book = LibraryManager.getBook(isbn);
BookDto bookDto = DtoMapper.book2BookDtos(book);
return ok(Json.toJson(bookDto));
}
}
LibraryManager(将域模型请求转换为域模型响应):
public class LibraryManager {
@Inject CacheApi cache;
public static Book getBook(String isbn) {
Book book = cache.get(isbn);
// ...
}
我这里的问题是我得到
non-static variable cache cannot be referenced from a static context
我注入缓存的方式与 Play 2.4.2 Cache API documentation. I didn't have this problem when I used caching as per the Play 2.2.x Cache API documentation 一致。那个版本有一个我可以调用的静态方法。
我该怎么办?我应该让 getBook 非静态应用一些单例模式吗?或者我应该以其他方式访问缓存吗?示例代码肯定会有所帮助!
使用 @Singleton
注释使 Guice
知道 LibraryManager
,从方法中删除 static 关键字并将它们拉到接口:
@ImplementedBy(LibraryManager.class)
public interface ILibraryManager {
//
}
@Singleton
public class LibraryManager implements ILibraryManager {
@Inject
private CacheApi cache;
@Override
public Book getBook(String isbn) {
Book book = cache.get(isbn);
// ...
}
}
现在您可以通过接口向您的控制器注入 LibraryManager
:
public class LibraryController extends Controller {
@Inject
private ILibraryManager libraryManager;
}
恭喜!您解耦 LibraryManager
并以适当的方式将其与 Play 2.4
集成。
在静态函数中获取 CacheApi.class 的实例。
public class LibraryManager {
public static Book getBook(String isbn) {
CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
Book book = cache.get(isbn);
// ...
}