This post is in my Fat Controller CQRS Diet series. It demonstrates how to thin your controllers by implementing commands and queries using the MediatR library. I’m converting the MusicStore application that’s using ASP.NET Core MVC. All the source code is available on GitHub. If you’re new to this series, here are earlier posts to get up to speed:
Sponsor: Do you build complex software systems? See how NServiceBus makes it easier to design, build, and manage software systems that use message queues to achieve loose coupling. Get started for free.
LoggingIn the my previous Command Pipeline example, I leveraged StructureMap and the decorator pattern to setup a pipeline. My pipeline would invoke the actual command handler as well as any classes that implemented the correct
IPostRequestHandler<TRequest, TResponse>.This enabled us to create a
AddToCartLogHandlerwhich did our logging that was originally in the
NotificationsAnother way to implement this is with a Notification (event). MediatR has this concept built in with a couple interfaces
IAsyncNotificationThe concept and how it works with MediatR very similar as a request (Command or Query) and it’s appropriate handler. The difference with a Notification is it can have many handlers.
- Request: only one handler
- Notification: zero to many handlers
ImplementationI’m going to jump back to our AddToCart command. Instead of it using an IPostRequestHandler<AddToCart, Unit> that I created for our pipeline, I’m going to instead create a notification and publish that notification from MediatR. First, we need to create a class to represent our notification. All the class will contain is a property to specify the AlbumId that was added to the shopping cart. Now we will create a Notification Handler that will accept this new notification object and do the logging. Finally, our last piece is to Publish a new
AlbumAddedToCartnotification to MediatR. We can do so in our