【问题标题】:How to handle dependent async operations in a domain class (Java)?如何处理域类(Java)中的依赖异步操作?
【发布时间】: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


【解决方案1】:

我想知道这是否是按照 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2015-11-22
    • 1970-01-01
    • 2020-10-30
    • 2019-10-16
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多