Я создаю CQRS и приложение на основе событий с Rails и RailsEventStore. В RailsEventStore кажется, что вы должны наследовать классы, которые представляют события от RailsEventStore :: Event.
class UserRegistered < RailsEventStore::Event
…
end
Этот базовый класс предоставляет event_id, хеш данных и необязательный хеш метаданных. Насколько я понимаю, это больше похоже на то, что Грег Янг однажды назвал конвертом события, и моя модель предметной области должна заботиться только о реальном событии, которое хранится в хэш-памяти данных конвертов.
Теперь я хотел бы применить схему к моему событию. Но похоже, что RailsEventStore хочет, чтобы я смоделировал подкласс RailsEventStore :: Event (конверт) для каждого типа события, различающегося моей моделью домена.
Проверка содержимого хэша данных в подклассе конверта кажется хакерской и грязной. Мне всегда нужно переопределить метод инициализации и передать то, что мне действительно безразлично.
class UserRegistered < RailsEventStore::Event
def initialize(event_id: SecureRandom.uuid, metadata: nil, data: {})
ensure_valid!(data)
super(event_id: event_id, metadata: metadata, data: data)
end
def ensure_valid!(data)
raise ArgumentError unless data[:user_id]
end
end
Также не очень приятен доступ ко всем атрибутам событий через event.data[:my_attribute]
. Добавление большого количества методов делегирования для каждого подкласса конверта также представляется бесполезным.
Я бы предпочел смоделировать обычный объект Ruby или использовать что-то вроде Dry :: Struct, чтобы применить схему к атрибутам содержимого моего события.
class UserRegistered < Dry::Struct
attribute :user_id, Dry::Types::String
end
Я что-то здесь упускаю? Как я могу проверить свои события в чистом виде?