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!