Как обрабатывать зависимые асинхронные операции в доменном классе (Java)? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть класс, в котором некоторые операции зависят друг от друга.

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.Если нет, я сначала загрузю его.Точно так же в классе есть другие методы (например, extract), которые зависят от метода convert, то есть, если преобразование не выполнено, они попытаются преобразовать его.Это делается для того, чтобы вызывающий метод не беспокоился о порядке.

Моя проблема с асинхронными методами.Когда последовательность методов выглядит следующим образом:

MyFile myfile = new MyFile();
myfile.convertAsync()
myfile.extractAsync()

Внутри extractAsync (), я не могу быть уверен, что преобразование произошло, поскольку оно происходит в отдельном потоке.Таким образом, извлечение также запустит преобразование, что приведет к преобразованию файла.Та же проблема возникает в любом из других зависимых методов asycn.

Если я возвращаю CompletableFuture из асинхронных методов и заставляю пользователя объединять операции в цепочку, чтобы извлечение вызывалось только после завершения преобразования, пользователь должен знать порядок методов, что противоречит моей целии отличается от реализации синхронизации тех же методов.

Я хочу знать, является ли это правильным способом обработки зависимых операций в классе домена согласно DDD.Если да, как справиться с этим сценарием?

1 Ответ

0 голосов
/ 07 марта 2019

Я хочу знать, является ли это правильным способом обработки зависимых операций в классе домена согласно DDD.Если да, как справиться с этим сценарием?

Один из подходов, который следует рассмотреть, - это оставить всю асинхронную работу на уровне приложений.

Основная идея заключается в том, что модель вашего домена- который по сути является просто бухгалтерским устройством - действует как конечный автомат памяти.Так что у него нет собственных асинхронных побочных эффектов.Вместо этого он сообщает приложению, какую информацию ему нужно для чтения / записи, и приложение отвечает за выяснение того, как это сделать.

if (domainModel.needsData()) {
    val data = application.readData()
    domainModel.onData(data)
}

См. Функциональное ядро, Imperative Shell отГэри Бернхардт и Построение протокольных библиотек правильным путем Кори Бенфилд.

...