Last active
December 9, 2016 12:37
-
-
Save syed-afraz-ali/367a53604b03cfd073fe to your computer and use it in GitHub Desktop.
Simple CQRS using MediatR
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using MediatR; | |
namespace MediatR_101 | |
{ | |
// The Query GetWeather that we will use to get weather status of any city | |
public class GetWeather : IRequest<Weather> | |
{ | |
public GetWeather(String city) | |
{ | |
City = city; | |
} | |
public String City { get; set; } | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Net.NetworkInformation; | |
using System.Text; | |
using System.Threading.Tasks; | |
using MediatR; | |
using StructureMap; | |
using StructureMap.Graph; | |
namespace MediatR_101 | |
{ | |
// Initializes Structuremap as the default DI container and sets up MediatR | |
public class IoC | |
{ | |
public static IContainer GetContainer() | |
{ | |
return new Container(cfg => | |
{ | |
cfg.Scan(scanner => | |
{ | |
scanner.TheCallingAssembly(); | |
scanner.AssemblyContainingType<IMediator>(); | |
scanner.WithDefaultConventions(); | |
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>)); | |
scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<,>)); | |
scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>)); | |
scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncNotificationHandler<>)); | |
}); | |
cfg.For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t)); | |
cfg.For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t)); | |
}); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Introduction to MediatR | |
https://github.com/jbogard/MediatR/blob/master/src/MediatR.Examples.StructureMap/Program.cs | |
Configuring MediatR with Structuremap | |
https://github.com/jbogard/MediatR/blob/master/src/MediatR.Examples.StructureMap/Program.cs | |
MediatR Wiki | |
https://github.com/jbogard/MediatR/wiki | |
CQRS And MediatR Articles by Jimmy Bogard | |
https://lostechies.com/jimmybogard/category/mediatr/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using MediatR; | |
using StructureMap; | |
namespace MediatR_101 | |
{ | |
class Program | |
{ | |
private static IContainer _container; | |
static void Main(string[] args) | |
{ | |
_container = IoC.GetContainer(); | |
//------------------------------------------- | |
// Example of using MediatR to Query for data | |
//------------------------------------------- | |
// Get an instance of MediatR from DI Container | |
var mediatR = _container.GetInstance<IMediator>(); | |
// Send a Query to get Weather Status for a city | |
var weather = mediatR.Send(new GetWeather("Kuala Lumpur")); | |
Console.WriteLine(weather.Summary); | |
//------------------------------------------- | |
// Example of using MediatR to Send | |
// one way 'Command' or 'Message' | |
//------------------------------------------- | |
// Send a Command to Update Weather of Kuala Lumpur to 25 C | |
mediatR.Send(new UpdateWeather("Kuala Lumpur", 25)); | |
Console.ReadLine(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using MediatR; | |
namespace MediatR_101 | |
{ | |
// This class automatically handles the command for UpdateWeather sent to MediatR | |
// In real world project this class can be a Service, repository or any other componenet that will be interested to a particular message or command | |
public class UpdateHandler : RequestHandler<UpdateWeather> | |
{ | |
protected override void HandleCore(UpdateWeather message) | |
{ | |
Console.WriteLine("Weather for {0} was updated and temperature set to {1}", message.City, | |
message.Temperature); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using MediatR; | |
namespace MediatR_101 | |
{ | |
// Update Weather Command, this is a one way Command and we will not get any response against it | |
public class UpdateWeather : IRequest | |
{ | |
public UpdateWeather(String city, Int32 temperature) | |
{ | |
City = city; | |
Temperature = temperature; | |
} | |
public String City { get; set; } | |
public Int32 Temperature { get; set; } | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace MediatR_101 | |
{ | |
// Weather Message that will be returned when some one queries for it | |
public class Weather | |
{ | |
public String Summary { get; set; } | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using MediatR; | |
namespace MediatR_101 | |
{ | |
// This class automatically handles the request for GetWeather query is sent to MediatR | |
// In real world project this class can be a Service, repository or any other componenet that will respond to a particular query | |
public class WeatherHandler : IRequestHandler<GetWeather, Weather> | |
{ | |
public Weather Handle(GetWeather query) | |
{ | |
return new Weather() | |
{ | |
Summary = String.Format("Forecast for {0}, Partially cloudy.", query.City) | |
}; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment