grade icon indicating copy to clipboard operation
grade copied to clipboard

The mediator pattern implementation

Open comeuplater opened this issue 1 year ago • 0 comments

Сделал две реализации:

Подобно проекту 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)
}

comeuplater avatar Feb 23 '24 06:02 comeuplater