The mediator pattern is often used in CQRS architectures to decouple components involved in handling commands and queries.
Using MediatR in a CQRS setup helps by providing a mediator to send requests (commands or queries) and handle them separately. This separation simplifies the code, improves maintainability, and makes it easier to reason about each operation independently.
As for the benefits of unit testing when implementing MediatR, it generally enhances the overall quality of your code. Unit tests allow you to verify the correctness of individual components in isolation, ensuring that each command or query handler behaves as expected. This can lead to more robust and reliable CQRS implementations, helping you catch and fix issues early in the development process.
Introducing My own MediaTr (KhatiMediaTr) Nuget that can be use in CQRS pattern.
Package Manager
NuGet\Install-Package KhatiMediaTr -Version 1.0.0
Add Middleware
builder.Services.AddMediaTr();
Implement Your Service, For Example:
namespace MyProjectTest.Services{public class MyService : IMyService{public IOtherDependency _otherDependency;public MyService(IOtherDependency otherDependency){_otherDependency = otherDependency;}public string Print(){return "Hello World";}public (string message, string description) PrintTupple(){return ("Hello World","I am Tupple");}public List<MyModel> GetModel(){MyModel model = new MyModel() { MyObject = "Hello" };List<MyModel> list = new List<MyModel>();list.Add(model);return list;}//You can Add parameters as per as your requirementspublic AddParms Request(string value, string value1 , List<MyModel> myModel, MyModel model){AddParms parms = new AddParms(){value = value,value1 = value1,myModel = myModel,model = model};return parms;}public void Wait(){_otherDependency.Wait();}}}public class MyModel{public string MyObject { set; get; }}public class AddParms{public string value { set; get; }public string value1 { set; get; }public List<MyModel> myModel { set; get; }public MyModel model { set; get; }}
CQRS -> Query
Print Query
using KhatiMediaTr;using MyProjectTest.Services;namespace MyProjectTest.CQRS.Query{public class PrintQuery : IEventHandler{private readonly IMyService _myService;public PrintQuery(IMyService myService){_myService = myService;}public string Handler(){return _myService.Print();}}}
Print Tuple
using KhatiMediaTr;using MyProjectTest.Services;namespace MyProjectTest.CQRS.Query{public class PrintTuple : IEventHandler{private readonly IMyService _myService;public PrintTuple(IMyService myService){_myService = myService;}public (string message, string description) Handler(){return _myService.PrintTupple();}}}
Print Reference
using KhatiMediaTr;using MyProjectTest.Services;namespace MyProjectTest.CQRS.Query{public class PrintReference : IEventHandler{private readonly IMyService _myService;public PrintReference(IMyService myService){_myService = myService;}public List<MyModel> Handler(){return _myService.GetModel();}}}
CQRS-> Command
Request
public class Request : IEventHandler{private readonly IMyService _myService;public Request(IMyService myService){_myService = myService;}public AddParms Handler(string value, string value1, List<MyModel> myModel, MyModel model){return _myService.Request(value,value1,myModel,model);}}
Void Request
using KhatiMediaTr;using MyProjectTest.Services;namespace MyProjectTest.CQRS.Command{public class DoSomething : IEventHandler{private readonly IMyService _myService;public DoSomething(IMyService myService){_myService = myService;}public void Handler(){_myService.Wait();}}}
Inject From Controller
using KhatiMediaTr;using Microsoft.AspNetCore.Mvc;using MyProjectTest.CQRS.Command;using MyProjectTest.CQRS.Query;namespace MyProjectTest.Controllers{public class HomeController : Controller{private readonly IMediaTr<PrintQuery, string> _printQuery;private readonly IMediaTr<PrintTuple, (string message , string description)> _printTupleMediaTr;private readonly IMediaTr<PrintReference, List<MyModel>> _printRefernece;private readonly IMediaTr<Request, AddParms> _requestMediaTr;private readonly IMediaTr<DoSomething,bool> _requestDoSomething;public HomeController(IMediaTr<PrintQuery, string> printQuery,IMediaTr<PrintTuple, (string message, string description)> printTupleMediaTr,IMediaTr<PrintReference, List<MyModel>> printRefernece,IMediaTr<Request, AddParms> requestMediaTr,IMediaTr<DoSomething, bool> requestDoSomething){_printQuery = printQuery;_printTupleMediaTr = printTupleMediaTr;_printRefernece = printRefernece;_requestMediaTr = requestMediaTr;_requestDoSomething = requestDoSomething;}public IActionResult PrintQuery(){var data = _printQuery.Send();return Ok(data);}public IActionResult PrintTuple(){var data = _printTupleMediaTr.Send();return Ok(new { message = data.message, description = data.description });}public IActionResult PrintReference(){var data = _printRefernece.Send();return Ok(data);}public IActionResult FakePostRequest(){string value = "value";string value1 = "value1";MyModel model = new MyModel(){MyObject = "MyObject"};var data = new List<MyModel>();data.Add(model);var request = _requestMediaTr.Send(new object[] { value, value1, data, model });return Ok(request);}public IActionResult DoSomething(){var data = _requestDoSomething.Send();return Ok(data);}}}
Open Source
https://github.com/ShamsiShakeeb/KhatiMediaTr
Implementation in ASP.NET MVC Project
https://github.com/ShamsiShakeeb/KhatiMediaTrNugetImplementation