Skip to content

Commit

Permalink
Adding PublishCore so that users can override the behavior of Task.Wh…
Browse files Browse the repository at this point in the history
…enAll on notification handlers

Fixes #121
  • Loading branch information
jbogard committed Jan 5, 2017
1 parent 85ed1f0 commit 884929c
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/MediatR/Mediator.cs
Expand Up @@ -3,6 +3,7 @@
using Internal;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -70,6 +71,16 @@ public Task Publish<TNotification>(TNotification notification, CancellationToken
.Concat(asyncNotificationHandlers)
.Concat(cancellableAsyncNotificationHandlers);

return PublishCore(allHandlers);
}

/// <summary>
/// Override in a derived class to control how the tasks are awaited. By default the implementation is <see cref="Task.WhenAll(IEnumerable{Task})" />
/// </summary>
/// <param name="allHandlers">Enumerable of tasks representing invoking each notification handler</param>
/// <returns>A task representing invoking all handlers</returns>
protected virtual Task PublishCore(IEnumerable<Task> allHandlers)
{
return Task.WhenAll(allHandlers);
}
}
Expand Down
47 changes: 47 additions & 0 deletions test/MediatR.Tests/AsyncPublishTests.cs
@@ -1,6 +1,7 @@
namespace MediatR.Tests
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
Expand Down Expand Up @@ -75,5 +76,51 @@ public async Task Should_resolve_main_handler()
result.ShouldContain("Ping Pong");
result.ShouldContain("Ping Pung");
}

public class SequentialMediator : Mediator
{
public SequentialMediator(SingleInstanceFactory singleInstanceFactory, MultiInstanceFactory multiInstanceFactory)
: base(singleInstanceFactory, multiInstanceFactory)
{
}

protected override async Task PublishCore(IEnumerable<Task> allHandlers)
{
foreach (var handler in allHandlers)
{
await handler;
}
}
}

[Fact]
public async Task Should_override_with_sequential_firing()
{
var builder = new StringBuilder();
var writer = new StringWriter(builder);

var container = new Container(cfg =>
{
cfg.Scan(scanner =>
{
scanner.AssemblyContainingType(typeof(AsyncPublishTests));
scanner.IncludeNamespaceContainingType<Ping>();
scanner.WithDefaultConventions();
scanner.AddAllTypesOf(typeof(IAsyncNotificationHandler<>));
});
cfg.For<TextWriter>().Use(writer);
cfg.For<IMediator>().Use<SequentialMediator>();
cfg.For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t));
cfg.For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t));
});

var mediator = container.GetInstance<IMediator>();

await mediator.Publish(new Ping { Message = "Ping" });

var result = builder.ToString().Split(new[] { Environment.NewLine }, StringSplitOptions.None);
result.ShouldContain("Ping Pong");
result.ShouldContain("Ping Pung");
}
}
}

0 comments on commit 884929c

Please sign in to comment.