Mediatr - Где правильное место для аннулирования / обновления кэша - PullRequest
0 голосов
/ 30 декабря 2018

Этот вопрос связан с другим вопросом, который я задавал о слишком многих интерфейсах, QCRS и библиотеке Mediatr (запрос / ответ)

Mediatr: уменьшение количества объектов DI

Я создал кучу команд и запросов, и у меня есть куча поведений, и одним из них является поведение Cache, при котором для каждого запроса проверяется значение кэша перед тем, как запрос фактически выполняется для базы данных.Пока это работает отлично, но деликатная проблема приходит, когда у меня есть UpdateSomethingCommand, когда я обновляю базовый объект в БД, я хотел бы обновить кэш с тем, что было успешно сохранено в БД.

Мой вопрос, в частности, когда фактически обновлять кеш:

  1. В UpdateSomethingCommandHandler (это может нарушить принцип SOLID)
  2. Вызвать другую команду в UpdateSomethingCommandHanlder, которая специально предназначена для обновления кешей.(не уверен, что это хороший принцип проектирования)
  3. Введите другое поведение, специально разработанное для обновления кэшей (пока не знаете, как это сделать)
  4. Есть ли лучшее решение?

1 Ответ

0 голосов
/ 07 июля 2019

У нас возникла аналогичная потребность в проекте, который использует MediatR и в итоге включил кэширование в конвейер посредника, включая аннулирование кэша, как вы описали.

Основная предпосылка заключается в том, что у нас есть два разных поведения, вставленных вконвейер, один для кэширования ответа на запрос и один для аннулирования кэшированного ответа на запрос от другого запроса.

Существует небольшое взаимодействие между двумя поведениями в том факте, что им нужно обмениватьсяключ кэша для аннулирования правильного запроса.

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

Вместо того, чтобы повторять все здесь и сейчас, я укажу вам на страницу проекта, где естьнекоторая документация по ссылке Начало работы на домашней странице: https://github.com/Imprise/Imprise.MediatR.Extensions.Caching

На мой взгляд, аннулирование кэша делает весь процесс чрезвычайно простым и понятным, но в некоторых случаях нам требовался более точный контроль над тем, когда происходит аннулирование,В этих случаях другой подход, который мы выбрали, заключается в том, чтобы ввести ICache<TRequest, TResponse> cache в INotificationHandler s и затем вызвать _cache.Remove(key); вручную, если необходимо.Затем из любых ваших запросов следует признать недействительными просто поднять уведомление, которое обрабатывается INotificationHandler например _mediator.Publish(SomethingUpdated);

...