using System.Threading.Tasks;
public static void Main()
var iocContainer = GetContainer();
var controller = iocContainer.Resolve<Controller>();
Console.WriteLine(controller.Hello("World").Result);
Console.WriteLine(controller.GoodMorning("World").Result);
public static IContainer GetContainer()
var container = new Container();
container.RegisterDelegate<SingleInstanceFactory>(r => serviceType => r.Resolve(serviceType));
container.RegisterDelegate<MultiInstanceFactory>(r => serviceType => r.ResolveMany(serviceType));
container.Register<IMediator, Mediator>();
container.RegisterMany(new[] {typeof (Program).GetAssembly()},
type => type.IsGenericType && type.GetGenericTypeDefinition() == typeof (IAsyncRequestHandler<,>));
container.Register<Controller>();
public class HelloRequest<T> : IAsyncRequest<string> where T : class
public string Name { get; set; }
public class HelloRequestHandler<T> : IAsyncRequestHandler<HelloRequest<T>, string> where T : class
public async Task<string> Handle(HelloRequest<T> message)
return await Task.FromResult("Hello, " + message.Name);
public class GoodMorningRequest<T> : IAsyncRequest<string> where T : class
public string Name { get; set; }
public class GoodMorningRequestHandler<T> : IAsyncRequestHandler<GoodMorningRequest<T>, string> where T : class
public async Task<string> Handle(GoodMorningRequest<T> message)
return await Task.FromResult("Good Morning, " + message.Name);
private readonly IMediator _mediator;
public Controller(IMediator mediator)
public async Task<string> Hello(string name)
return await _mediator.SendAsync(new HelloRequest<EventArgs> {Name = name});
public async Task<string> GoodMorning(string name)
return await _mediator.SendAsync(new GoodMorningRequest<Exception> {Name = name});