我目前正在使用Play Framework编写典型的REST API Play控制器(你知道的静态方法)可以调用一些服务 服务由ServicesManager提供 代码类似于:
class RestController {
protected static UserService userService;
protected static void getServices() {
userService = ServicesManager.getUserService();
}
}
class UserApiController extends RestController {
public static Result createUser() {
getServices();
...
userService.createUser();
...
}
public static Result updateUser(String userId) {
getServices();
...
userService.updateUser(...);
...
}
}
我的代码中有几件事让我烦恼:
- 在每个控制器方法中使用getServices()。我怎么能避免呢?
- 设计基于静态(由于播放)和受保护的访问。它意味着强耦合。你是否同意(或不同意)这是一个相当严重的设计缺陷?
感谢。
答案 0 :(得分:1)
根据您使用的Play版本,您可以采取一些步骤使代码“更少WET”和/或更松散耦合:
扩展play.GlobalSettings
(如果您还没有这样做),并覆盖onStart
方法:
@Override
public void onStart(final Application app) {
// Initialise your ServicesManager class here
}
接下来,我将从父控制器中删除getServices()
方法:
public class RestController extends Controller {
protected static UserService userService = ServicesManager.getUserService();
// Other service declarations ...
}
这样您就不必从每个操作方法中调用getServices()
。
正如您所提到的,在早期版本的Play控制器类中没有实例化,操作被定义为静态方法。 Play 2.1引入了控制器实例化的概念,并让开发人员可以控制管理控制器的创建。您可以找到有关如何告诉Spring框架管理控制器和连接服务类的参考实现here。这现在有助于松散耦合的代码。