DDD: referenciando a interface MediatR do projeto de domínio

Estou apenas começando com o DDD. Estou colocando eventos de domínio em um aplicativo CQRS e estou encontrando uma tarefa fundamental: como usar a interface do marcador MediatR.INotification no projeto de domínio sem criar uma dependência de domínio da infraestrutura.

Minha solução está organizada em quatro projetos, da seguinte maneira:

MyApp.Domain
    - Domain events
    - Aggregates
    - Interfaces (IRepository, etc), etc.
MyApp.ApplicationServices
    - Commands
    - Command Handlers, etc.
MyApp.Infrastructure
    - Repository
    - Emailer, etc.
MyApp.Web
    - Startup
    - MediatR NuGet packages and DI here
    - UI, etc.

No momento, tenho os pacotes DI Core MediatR e MediatR .net instalados no projeto da interface do usuário e eles são adicionados ao DI usando .AddMediatR (), com o comando

services.AddMediatR(typeof(MyApp.AppServices.Commands.Command).Assembly);

que verifica e registra manipuladores de comando do projeto AppServices.

O problema surge quando quero definir um evento. Para o MediatR trabalhar com meus eventos de domínio, eles precisam ser marcados com a interface MediatR.INotification.

namespace ObApp.Domain.Events
{
    public class NewUserAdded : INotification
    {
        ...
    }

Qual é a maneira correta de marcar meus eventos nessa situação para que possam ser usados pelo MediatR? Posso criar minha própria interface de marcador para eventos, mas o MediatR não reconhecerá aqueles sem alguma maneira de convertê-los automaticamente para o MediatR.INotification.

Isso é apenas uma falha no uso de vários projetos? Mesmo se eu estivesse usando um único projeto, estaria colocando uma interface "externa" no domínio se usasse o MediatR.INotification na seção domínio.

Encontrei o mesmo problema quando minha entidade de usuário herdou o IdentityUser da EF. Nesse caso, o consenso na Web parece ser pragmático, vá em frente e permita que a menor poluição economize muitas dores de cabeça. Esse é outro caso semelhante? Não me importo de sacrificar a pureza pelo pragmatismo, mas não apenas por ser preguiçoso.

Esta é uma questão fundamental que ocorrerá com outros pacotes que eu uso, por isso estou ansioso para resolver isso.

Obrigado!

questionAnswers(4)

yourAnswerToTheQuestion