在控制器中播放框架和DRY

时间:2013-12-12 09:38:41

标签: playframework controller dry

我目前正在使用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()。我怎么能避免呢?   - 设计基于静态(由于播放)和受保护的访问。它意味着强耦合。你是否同意(或不同意)这是一个相当严重的设计缺陷?

感谢。

1 个答案:

答案 0 :(得分:1)

根据您使用的Play版本,您可以采取一些步骤使代码“更少WET”和/或更松散耦合:

Play 2.0及以下版本

扩展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()

继续播放2.1

正如您所提到的,在早期版本的Play控制器类中没有实例化,操作被定义为静态方法。 Play 2.1引入了控制器实例化的概念,并让开发人员可以控制管理控制器的创建。您可以找到有关如何告诉Spring框架管理控制器和连接服务类的参考实现here。这现在有助于松散耦合的代码。