Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 在play框架中遵循服务和dao层方法将减少play';它的主要特点是什么?_Playframework_Playframework 2.4 - Fatal编程技术网

Playframework 在play框架中遵循服务和dao层方法将减少play';它的主要特点是什么?

Playframework 在play框架中遵循服务和dao层方法将减少play';它的主要特点是什么?,playframework,playframework-2.4,Playframework,Playframework 2.4,我正在使用PlayFramework2.4.x开发一个web应用程序,在controller之后,我遵循了服务层和DAO层的方法。这种方法是否会对play的主要功能(如异步和线程池等)产生任何问题?我遇到了许多从控制器本身调用db连接的示例应用程序 我是否可以使用上述方法?我使用DAO等,没有问题。确保你使用的是期货 例如,不要使用像List findAll()这样的DAO方法,而是使用F.Promise findAll() 如果您使用的是不同的线程池,那么您需要为DAO和服务提供必要的exec

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


我是否可以使用上述方法?

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

例如,不要使用像
List findAll()
这样的DAO方法,而是使用
F.Promise findAll()

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

public class MyExecutionProvider implements Supplier<ExecutionContext> {
    public ExecutionContext get() {
        return HttpExecution.defaultContext();
    }
}
公共类MyExecutionProvider实现供应商{
publicExecutionContext get(){
返回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());
    }
}
@Singleton
公共类食物{
私人最终供应商ec;
@注入
公共FooDao(最终供应商ec){
this.ec=ec;
}
公共F.承诺芬德尔(){
返回F.Promise.Promise(()->//某个数据库调用,
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)
    }
}
公共类FooController扩展控制器{
私人最终食物岛食物岛;
@注入
公共食物控制员(最终食物道食物道){
this.fooDao=fooDao;
}
公共F.Promise getAll(){
返回fooDao.findAll()
.map(Json::toJson)
(结果:ok)
}
}

根据需要调整Scala、接口使用、首选体系结构等。

我使用您的方法处理服务层和DAO,没有任何问题。