grade
grade copied to clipboard
The mediator pattern implementation
Сделал две реализации:
Подобно проекту https://github.com/mehdihadeli/Go-MediatR/. В нем мне не понравилось, что там публикация событий которые не возвращают ошибок выделяется в набор отдельных методов NotificationHandlers и так же есть такой же набор для обработчиков которые возвращают результат в сигнатуре и два разных метода на отправку событий. Как по мне переусложнили решение. Но такое решение благодаря джереникам позволяет отлавливать ошибки на этапе компиляции, но ему присущи все +/- глобального доступа. К тому же сейчас глобальная версия использует локи, это вызовет замедление при нагрузке, но там можно будте заменить на подобное https://github.com/orcaman/concurrent-map
Второе решение проверяет сигнатуры только в рантайме, это довольно печально. Ибо нельзя подкидывать разные джерики для метов с одинаковым ресивером. Можно совместить техники из двух вариантов и получить что-то подобное:
var m = NewRefUntypedMediator()
func strictSend[E any](m RefUntypedMediator, ctx context.Context, event E) error {
return m.Send(ctx, event)
}