Last active
March 19, 2016 11:48
-
-
Save danielwertheim/887868c17ab8cd67be44 to your computer and use it in GitHub Desktop.
How not to bootstrap MediatR and Autofac, as it will never release inner dependencies... Pretty much follows this: https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.Autofac/Program.cs
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.Threading.Tasks; | |
using Autofac; | |
using Autofac.Features.Variance; | |
using MediatR; | |
namespace ConsoleApplication2 | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var builder = new ContainerBuilder(); | |
builder.RegisterAssemblyModules(typeof(Program).Assembly); | |
var container = builder.Build(); | |
var router = container.Resolve<IMediator>(); | |
router.PublishAsync(new MyMessage()).Wait(); | |
router.PublishAsync(new MyMessage()).Wait(); | |
} | |
} | |
public class MyMessage : IAsyncNotification { } | |
public class ConcreteHandler : | |
IAsyncNotificationHandler<MyMessage>, | |
IDisposable | |
{ | |
private readonly SomeDependency _dependency; | |
public ConcreteHandler(SomeDependency dependency) | |
{ | |
_dependency = dependency; | |
} | |
public async Task Handle(MyMessage message) | |
{ | |
await _dependency.DoWorkAsync(); | |
} | |
public void Dispose() | |
{ | |
Console.WriteLine("I am being released"); | |
} | |
} | |
public class SomeDependency : IDisposable | |
{ | |
public Task DoWorkAsync() | |
{ | |
Console.WriteLine("Doing work with underlying connection"); | |
return Task.FromResult(0); | |
} | |
public void Dispose() | |
{ | |
Console.WriteLine("I'm cleaning the underlying connection."); | |
} | |
} | |
public class OurModule : Module | |
{ | |
protected override void Load(ContainerBuilder builder) | |
{ | |
builder.RegisterSource(new ContravariantRegistrationSource()); | |
builder.Register<SingleInstanceFactory>(ctx => | |
{ | |
var c = ctx.Resolve<IComponentContext>(); | |
return t => c.Resolve(t); | |
}); | |
builder.Register<MultiInstanceFactory>(ctx => | |
{ | |
var c = ctx.Resolve<IComponentContext>(); | |
return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t)); | |
}); | |
builder.RegisterType<Mediator>() | |
.As<IMediator>() | |
.SingleInstance(); | |
builder.RegisterType<SomeDependency>(); | |
builder.RegisterType<ConcreteHandler>() | |
.As<IAsyncNotificationHandler<MyMessage>>(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment