在 play 框架中遵循 service 和 dao 层的方法会减少 play 的主要功能吗?

Posted

技术标签:

【中文标题】在 play 框架中遵循 service 和 dao 层的方法会减少 play 的主要功能吗?【英文标题】:Following service and dao layer approach in play framework will reduce play's main features? 【发布时间】:2016-03-09 11:28:00 【问题描述】:

我正在使用 play framework 2.4.x 开发一个 Web 应用程序,并且我在控制器之后遵循了服务层和 DAO 层方法。这种方法是否会对 play 的主要功能(如异步和线程池等)产生任何问题?我遇到了很多从控制器本身调用数据库连接的示例应用程序。

我可以使用上述方法吗?

【问题讨论】:

我在服务层和 DAO 上使用你的方法没有问题。 【参考方案1】:

我使用 DAO 等,没有问题。确保您使用的是期货!

例如,没有像 List<Foo> findAll() 这样的 DAO 方法 - 而是有 F.Promise<List<Foo>> findAll()

如果您使用不同的线程池,则需要为您的 DAO 和服务提供必要的执行器服务 - 在这种情况下,理想情况下,您应该为执行器服务注入一个供应商。默认实现就是

public class MyExecutionProvider implements Supplier<ExecutionContext> 
    public ExecutionContext get() 
        return HttpExecution.defaultContext();
    

为 DI 框架注册了必要的绑定。

生成的 DAO 将类似于

@Singleton
public class FooDao 

    private final Supplier<ExecutionContext> ec;

    @Inject
    public FooDao(final Supplier<ExecutionContext> ec) 
        this.ec = ec;
    

    public F.Promise<List<Foo>> findAll() 
        return F.Promise.promise(() -> // some database call,
                                 ec.get());
    

使用此 DAO 的控制器可以使用典型的异步方法。

public class FooController extends Controller 
    private final FooDao fooDao;

    @Inject
    public FooController(final FooDao fooDao) 
        this.fooDao = fooDao;
    

    public F.Promise<Result> getAll() 
        return fooDao.findAll()
                     .map(Json::toJson)
                     .(Results::ok)
    

根据需要调整 Scala、接口的使用、首选架构等。

【讨论】:

以上是关于在 play 框架中遵循 service 和 dao 层的方法会减少 play 的主要功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 play 框架中连接到本地 h2 数据库

来自 Google Play Services Fused Location Provider 的海拔高度

如何搭建scala的play框架

play框架用起来

Android Google Play 游戏服务回合制多人游戏不自动匹配

如何使用 Hudson 构建 Play 项目?