如何在域类(Java)中处理依赖的异步操作?

时间:2019-03-07 05:16:36

标签: java oop asynchronous design-patterns domain-driven-design

我有一个类,其中的某些操作相互依赖。

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处理域类中依赖操作的正确方法。如果是,该如何处理?

1 个答案:

答案 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

相关问题