Как мне отделить представление домена от самой модели домена в Java? - PullRequest
0 голосов
/ 27 сентября 2018

Как я могу отделить то, как (или даже если) модель домена рассматривается от реализации самого представления.В качестве примера рассмотрим следующий код:

public class Student
{
    private Set<Course> enrollment;
    public void enroll(Course c){
        // domain implementation
    }
    public void unenroll(Course c) {
       // domain implementation
    }

}

Это довольно простой пример, но он подходит для того, что я спрашиваю.Что было бы хорошим способом гарантировать, что представление этого объекта отделено от фактической функциональности домена?Например, этот студент должен быть в состоянии быть представленным в XML, JSON или даже в какой-то игре, или не иметь представления какого-либо вида.

Некоторые из подходов, о которых я подумал, могут быть примерно такими:

@XmlRootElement(name="student")
public class StudentXmlView implements XmlView<Student> {

    @XmlElement(name="enrollment")  
    private XmlVeiw<Set<Course>> enrollmentView;
}

Будет ли подход такого рода подходящим, или есть некоторые лучшие практики, которые обычно используются в Java дляотделить домен от его вида?

1 Ответ

0 голосов
/ 27 сентября 2018

Архитектура CQRS идеально подходит для такого разделения: она отделяет модель записи (Агрегаты в DDD) от модели чтения.

Модель записи специально разработана для защиты бизнес-инвариантов в отношении изменений состояния,Он выполняет команды.Это не может быть запрошено.

Модель чтения разработана, чтобы быть быстрой и подходящей для конкретного случая использования.У каждого варианта использования есть другая модель чтения.Здесь вы можете использовать любую технологию, которая лучше всего подходит.

Нет равенства между моделями записи и чтения.У вас может быть 3 модели записи и 1 модель чтения или любая комбинация.

В архитектуре микросервиса каждая модель (запись или чтение) может быть микросервисом.

Следующим шагом после CQRS являетсяИсточник событий.

...