【发布时间】:2019-03-07 05:16:35
【问题描述】:
我有一个类,它有一些相互依赖的操作。
class MyFile{
private String uploadedUri;
public void upload(){
// http upload
}
public void asyncUpload(){
// http async upload
}
public void convert(){
//http call to convert
}
public void convertAsync(){
//http call to convert, but async
}
public void extract(){
//http call to convert, but async
}
public void extractAsync(){
//http call to convert, but async
}
// some other operations
}
现在,我的转换操作依赖于上传,它只作用于上传的 URI。在同步转换中,我检查是否设置了 uri。没有的话我先上传。同样,类中还有其他方法(例如提取)依赖于转换方法,即如果转换未完成,它们将尝试转换它。这样做是为了让方法的调用者不必担心顺序。
我的问题在于异步方法。当方法的顺序是这样的:
MyFile myfile = new MyFile();
myfile.convertAsync()
myfile.extractAsync()
在 extractAsync() 中,我不能确定转换是否已经发生,因为它发生在一个单独的线程中。所以提取也将开始转换,这将导致文件的转换。同样的问题出现在任何其他相关的 asycn 方法中。
如果我从异步方法返回 CompletableFuture,并强制用户链接操作,以便仅在转换完成后调用提取,用户必须知道方法的顺序,这违背了我的目的,并且是与相同方法的同步实现不同。
我想知道这是否是按照 DDD 在域类中处理相关操作的正确方法。如果是,如何处理这种情况?
【问题讨论】:
-
“上传”通常意味着将信息从客户端传输到服务器。 “我检查是否设置了uri。如果没有,我会先上传它”是什么意思?从字面上看,这意味着客户端可以访问位于服务器中的 uri 变量,如果客户端看到它没有设置,它就会上传它。你真的是这个意思吗?通常客户端无法访问服务器的变量。
标签: java oop asynchronous design-patterns domain-driven-design