Пустые интерфейсы ICommand и IQuery при реализации CQRS - PullRequest
1 голос
/ 20 января 2020

Я читал о CQRS и гуглил несколько примеров. В этом процессе я нашел репозиторий GitHub для курса Pluralsight «CQRS на практике» (к сожалению, сейчас я не могу получить доступ к курсу). Я просматривал исходный код, а затем заметил кое-что, что сначала показалось мне неловким: есть два интерфейса ICommand и IQuery, которые просто оставлены пустыми . Другими словами:

public interface ICommand { }
public interface IQuery<TResult> { }

После этого все команды будут реализовывать ICommand, а все запросы будут реализовывать IQuery<TResult>.

Но это неудобно для меня. Интерфейс - это контракт . Класс, реализующий его, подпишет контракт и будет гарантированно иметь указанные методы. Здесь нет никакого метода вообще. Поэтому я действительно не понимаю, почему кто-то так поступил.

Так какой смысл иметь пустой интерфейс? Зачем кому-то создавать и внедрять интерфейсы, которые не определяют контракт?

1 Ответ

1 голос
/ 20 января 2020

Хорошая ссылка здесь - Эффективный Java, Джошуа Блох:

Используйте интерфейсы маркера для определения типов

A интерфейс маркера - это интерфейс, который не содержит объявлений методов, а просто обозначает (или «отмечает») класс, который реализует интерфейс как имеющий некоторое свойство.

Поскольку интерфейс маркера определяет тип, вы можете используйте средство проверки типов, чтобы перехватывать определенные категории ошибок во время компиляции, а не во время выполнения.

Блох предлагает конкретный вопрос: «Могу ли я написать один или несколько методов, которые принимают только объект, имеющий эту маркировку? "

В случае DDD хотели бы вы когда-нибудь написать метод, который принимает только ICommand или IQuery?

После быстрого сканирования примера Хорикова мне не очевидно, что ему нужно определить тип - аннотация или даже комментарий могут быть лучшим выбором.

...