我有一个类,其中的某些操作相互依赖。
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是否已设置。如果没有,我将首先上传它。类似地,该类中还有其他依赖于convert方法的方法(例如,提取),即,如果未完成转换,它们将尝试对其进行转换。这样做是为了使方法的调用者不必担心顺序。
我的问题是异步方法。当方法的顺序是这样的时候:
MyFile myfile = new MyFile();
myfile.convertAsync()
myfile.extractAsync()
在extractAsync()里面,我不确定转换是否发生,因为它发生在单独的线程中。因此,提取也将开始转换,这将导致文件转换。在任何其他依赖的asycn方法中也会出现相同的问题。
如果我从异步方法中返回CompletableFuture,并强迫用户链接操作,以便仅在转换完成后才调用提取,则用户必须知道方法的顺序,这违背了我的意图,并且不同于相同方法的同步实现。
我想知道这是否是根据DDD处理域类中依赖操作的正确方法。如果是,该如何处理?
答案 0 :(得分:0)
我想知道这是否是根据DDD处理域类中依赖操作的正确方法。如果是,该如何处理?
要考虑的一种方法是将所有异步工作留在应用程序层中。
基本思想是您的域模型-基本上只是一个簿记设备-充当内存中状态机。因此它本身没有异步副作用。相反,它告诉应用程序需要读取/写入哪些信息,并且应用程序负责确定如何执行此操作。
if (domainModel.needsData()) {
val data = application.readData()
domainModel.onData(data)
}
请参见Gary Bernhardt的Functional Core, Imperative Shell和Cory Benfield的Building Protocol Libraries the Right Way。