From a09ebefc6304f8dbbf6235663ff867079ad7cf38 Mon Sep 17 00:00:00 2001 From: Ivan Paulovich Date: Sat, 19 Oct 2019 23:55:01 +0200 Subject: [PATCH] Initial named pipeline support #2 --- changelog.md | 4 ++ .../icon.png | Bin samples/PingPong/Program.cs | 8 +-- ...soft.Extensions.DependencyInjection.csproj | 21 ++++---- .../FluentMediatorExtensions.cs | 30 +++++------ src/FluentMediator/FluentMediator.csproj | 19 +++---- src/FluentMediator/IMediator.cs | 11 ++-- src/FluentMediator/IPipelineProvider.cs | 6 +++ .../IPipelineProviderBuilder.cs | 12 +++++ src/FluentMediator/IPipelines.cs | 14 ----- src/FluentMediator/IPipelinesBuilder.cs | 16 ------ src/FluentMediator/Mediator.cs | 4 +- ...pelinesProvider.cs => PipelineProvider.cs} | 20 ++++---- ...sBuilder.cs => PipelineProviderBuilder.cs} | 48 +++++++++--------- .../AsyncPipeline/IAsyncPipelineBuilder.cs | 16 ------ .../CancellablePipelineBuilder.cs | 37 -------------- .../ICancellablePipelineBuilder.cs | 17 ------- .../Direct.cs} | 6 +-- .../ICancellablePipelineAsync.cs} | 6 +-- .../ICancellablePipelineAsyncBuilder.cs | 17 +++++++ .../IDirect.cs} | 4 +- .../IMediator.cs} | 5 +- .../IPipelineProvider.cs | 9 ++++ .../IPipelineProviderBuilder.cs | 7 +++ .../Pipeline.cs} | 21 +++----- .../PipelineBuilder.cs | 38 ++++++++++++++ .../Pipelines/IMethodCollection.cs | 2 +- .../Pipelines/INamedPipeline.cs | 7 +++ .../Pipelines/IPipelineBehavior.cs | 10 ++-- .../Pipelines/IPipelineCollection.cs | 9 ++-- .../Pipelines/ITypedPipeline.cs | 9 ++++ .../{IPipelineMediator.cs => IMediator.cs} | 2 +- .../Pipelines/Pipeline/IPipeline.cs | 5 +- .../Pipelines/Pipeline/IPipelineProvider.cs | 9 ++++ .../Pipeline/IPipelineProviderBuilder.cs | 7 +++ .../Pipelines/Pipeline/Pipeline.cs | 4 +- .../Pipelines/Pipeline/PipelineBuilder.cs | 6 ++- .../Direct.cs} | 6 +-- .../IDirect.cs} | 4 +- .../IMediator.cs} | 4 +- .../IPipelineAsync.cs} | 6 +-- .../PipelineAsync/IPipelineAsyncBuilder.cs | 16 ++++++ .../PipelineAsync/IPipelineProvider.cs | 9 ++++ .../PipelineAsync/IPipelineProviderBuilder.cs | 7 +++ .../Pipeline.cs} | 21 +++----- .../PipelineBuilder.cs} | 21 ++++---- .../Pipelines/PipelineBehavior.cs | 28 +++++----- .../Pipelines/PipelineCollection.cs | 38 +++++--------- src/FluentMediator/icon.png | Bin 4561 -> 0 bytes test/UnitTests/BuildingMediatorTests.cs | 33 +++++------- test/UnitTests/PublishingRequestsTests.cs | 25 +++++---- test/UnitTests/SendingRequestTests.cs | 11 ++-- 52 files changed, 358 insertions(+), 337 deletions(-) rename {src/FluentMediator.Microsoft.Extensions.DependencyInjection => docs}/icon.png (100%) create mode 100644 src/FluentMediator/IPipelineProvider.cs create mode 100644 src/FluentMediator/IPipelineProviderBuilder.cs delete mode 100644 src/FluentMediator/IPipelines.cs delete mode 100644 src/FluentMediator/IPipelinesBuilder.cs rename src/FluentMediator/{PipelinesProvider.cs => PipelineProvider.cs} (59%) rename src/FluentMediator/{PipelinesBuilder.cs => PipelineProviderBuilder.cs} (51%) delete mode 100644 src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineBuilder.cs delete mode 100644 src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipelineBuilder.cs delete mode 100644 src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineBuilder.cs rename src/FluentMediator/Pipelines/{CancellablePipeline/CancellableAsyncDirect.cs => CancellablePipelineAsync/Direct.cs} (79%) rename src/FluentMediator/Pipelines/{CancellablePipeline/ICancellablePipeline.cs => CancellablePipelineAsync/ICancellablePipelineAsync.cs} (66%) create mode 100644 src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsyncBuilder.cs rename src/FluentMediator/Pipelines/{CancellablePipeline/ICancellableAsync.cs => CancellablePipelineAsync/IDirect.cs} (66%) rename src/FluentMediator/Pipelines/{CancellablePipeline/ICancellablePipelineMediator.cs => CancellablePipelineAsync/IMediator.cs} (66%) create mode 100644 src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProvider.cs create mode 100644 src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProviderBuilder.cs rename src/FluentMediator/Pipelines/{CancellablePipeline/CancellablePipeline.cs => CancellablePipelineAsync/Pipeline.cs} (70%) create mode 100644 src/FluentMediator/Pipelines/CancellablePipelineAsync/PipelineBuilder.cs create mode 100644 src/FluentMediator/Pipelines/INamedPipeline.cs create mode 100644 src/FluentMediator/Pipelines/ITypedPipeline.cs rename src/FluentMediator/Pipelines/Pipeline/{IPipelineMediator.cs => IMediator.cs} (78%) create mode 100644 src/FluentMediator/Pipelines/Pipeline/IPipelineProvider.cs create mode 100644 src/FluentMediator/Pipelines/Pipeline/IPipelineProviderBuilder.cs rename src/FluentMediator/Pipelines/{AsyncPipeline/DirectAsync.cs => PipelineAsync/Direct.cs} (80%) rename src/FluentMediator/Pipelines/{AsyncPipeline/IDirectAsync.cs => PipelineAsync/IDirect.cs} (60%) rename src/FluentMediator/Pipelines/{AsyncPipeline/IAsyncPipelineMediator.cs => PipelineAsync/IMediator.cs} (60%) rename src/FluentMediator/Pipelines/{AsyncPipeline/IAsyncPipeline.cs => PipelineAsync/IPipelineAsync.cs} (58%) create mode 100644 src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsyncBuilder.cs create mode 100644 src/FluentMediator/Pipelines/PipelineAsync/IPipelineProvider.cs create mode 100644 src/FluentMediator/Pipelines/PipelineAsync/IPipelineProviderBuilder.cs rename src/FluentMediator/Pipelines/{AsyncPipeline/AsyncPipeline.cs => PipelineAsync/Pipeline.cs} (69%) rename src/FluentMediator/Pipelines/{AsyncPipeline/AsyncPipelineBuilder.cs => PipelineAsync/PipelineBuilder.cs} (53%) delete mode 100644 src/FluentMediator/icon.png diff --git a/changelog.md b/changelog.md index d5c91b4..815f788 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,9 @@ # Change Log +## 2019-10-20 - 0.4.0 + +* Refactoring + ## 2019-10-19 - 0.3.3 * #31 Support Scoped & Transient Lifetime. diff --git a/src/FluentMediator.Microsoft.Extensions.DependencyInjection/icon.png b/docs/icon.png similarity index 100% rename from src/FluentMediator.Microsoft.Extensions.DependencyInjection/icon.png rename to docs/icon.png diff --git a/samples/PingPong/Program.cs b/samples/PingPong/Program.cs index 8e37bed..35a18b0 100644 --- a/samples/PingPong/Program.cs +++ b/samples/PingPong/Program.cs @@ -10,14 +10,14 @@ class Program static void Main(string[] args) { var serviceCollection = new ServiceCollection(); - serviceCollection.AddFluentMediator(m => + serviceCollection.AddFluentMediator(builder => { - m.On().Pipeline() + builder.On().Pipeline() .Call((handler, req) => handler.MyMethod(req)) .Call((handler, req) => handler.MyLongMethod(req)); - m.On().AsyncPipeline() + builder.On().PipelineAsync() .Call(async(handler, req) => await handler.MyMethodAsync(req)); - m.On().CancellablePipeline() + builder.On().CancellablePipelineAsync() .Call(async(handler, req, ct) => await handler.MyMethodAsync(req, ct)); }); serviceCollection.AddScoped(); diff --git a/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediator.Microsoft.Extensions.DependencyInjection.csproj b/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediator.Microsoft.Extensions.DependencyInjection.csproj index 282d2ec..94ae2a0 100644 --- a/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediator.Microsoft.Extensions.DependencyInjection.csproj +++ b/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediator.Microsoft.Extensions.DependencyInjection.csproj @@ -6,24 +6,18 @@ FluentMediator.Microsoft.Extensions.DependencyInjection - 0.3.3 + 0.4.0 Ivan Paulovich Ivan Paulovich - FluentMediator is an unobtrusive library that allows developers to build custom pipelines for Commands, Queries and Events. - We will not require you to add dependencies into your domain or to implement frameworks interfaces in your event handlers. Finally a really loosely coupled mediator library was born. + Microsoft Extensions for FluentMediator. + Microsoft Extensions for FluentMediator. fluent-design;mediator-pattern;ddd-cqrs;message-bus;event-sourcing;event-driven;chain-of-responsibility;chain-methods;pipelines;dotnet-core;craftmanship;tdd;csharp;pipeline-framework;fluent-interface;event-handlers true icon.png https://github.com/ivanpaulovich/FluentMediator + en-US - - - True - - - - @@ -42,4 +36,11 @@ + + + True + + + + diff --git a/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediatorExtensions.cs b/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediatorExtensions.cs index 7003989..8523b61 100644 --- a/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediatorExtensions.cs +++ b/src/FluentMediator.Microsoft.Extensions.DependencyInjection/FluentMediatorExtensions.cs @@ -5,14 +5,14 @@ namespace FluentMediator { public static class FluentMediatorExtensions { - public static IServiceCollection AddFluentMediator(this IServiceCollection services, Action setupAction) + public static IServiceCollection AddFluentMediator(this IServiceCollection services, Action setupAction) { - var pipelinesBuilder = new PipelinesBuilder(); - setupAction(pipelinesBuilder); - var pipelines = pipelinesBuilder.Build(); + var pipelineProviderBuilder = new PipelineProviderBuilder(); + setupAction(pipelineProviderBuilder); + var pipelineProvider = pipelineProviderBuilder.Build(); services.AddTransient(c => c.GetService); - services.AddTransient(c => pipelines); + services.AddTransient(c => pipelineProvider); services.AddTransient(); return services; @@ -20,13 +20,13 @@ public static IServiceCollection AddFluentMediator(this IServiceCollection servi public static IServiceCollection AddSingletonFluentMediator( this IServiceCollection services, - Action setupAction) + Action setupAction) { - var pipelinesBuilder = new PipelinesBuilder(); - setupAction(pipelinesBuilder); - var pipelines = pipelinesBuilder.Build(); + var pipelineProviderBuilder = new PipelineProviderBuilder(); + setupAction(pipelineProviderBuilder); + var pipelineProvider = pipelineProviderBuilder.Build(); - services.AddSingleton(c => pipelines); + services.AddSingleton(c => pipelineProvider); services.AddSingleton(c => c.GetService); services.AddSingleton(); @@ -35,13 +35,13 @@ public static IServiceCollection AddFluentMediator(this IServiceCollection servi public static IServiceCollection AddScopedFluentMediator( this IServiceCollection services, - Action setupAction) + Action setupAction) { - var pipelinesBuilder = new PipelinesBuilder(); - setupAction(pipelinesBuilder); - var pipelines = pipelinesBuilder.Build(); + var pipelineProviderBuilder = new PipelineProviderBuilder(); + setupAction(pipelineProviderBuilder); + var pipelineProvider = pipelineProviderBuilder.Build(); - services.AddScoped(c => pipelines); + services.AddScoped(c => pipelineProvider); services.AddScoped(c => c.GetService); services.AddScoped(); diff --git a/src/FluentMediator/FluentMediator.csproj b/src/FluentMediator/FluentMediator.csproj index 182d244..26cc2ff 100644 --- a/src/FluentMediator/FluentMediator.csproj +++ b/src/FluentMediator/FluentMediator.csproj @@ -10,24 +10,18 @@ FluentMediator - 0.3.2 + 0.4.0 Ivan Paulovich Ivan Paulovich FluentMediator is an unobtrusive library that allows developers to build custom pipelines for Commands, Queries and Events. - We will not require you to add dependencies into your domain or to implement frameworks interfaces in your event handlers. Finally a really loosely coupled mediator library was born. + FluentMediator is an unobtrusive library that allows developers to build custom pipelines for Commands, Queries and Events. fluent-design;mediator-pattern;ddd-cqrs;message-bus;event-sourcing;event-driven;chain-of-responsibility;chain-methods;pipelines;dotnet-core;craftmanship;tdd;csharp;pipeline-framework;fluent-interface;event-handlers true icon.png https://github.com/ivanpaulovich/FluentMediator + en-US - - - True - - - - @@ -37,4 +31,11 @@ true snupkg + + + + True + + + diff --git a/src/FluentMediator/IMediator.cs b/src/FluentMediator/IMediator.cs index 7cc778d..d51d6e6 100644 --- a/src/FluentMediator/IMediator.cs +++ b/src/FluentMediator/IMediator.cs @@ -1,11 +1,6 @@ -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; -using FluentMediator.Pipelines.Pipeline; - namespace FluentMediator { - public interface IMediator : IPipelineMediator, IAsyncPipelineMediator, ICancellablePipelineMediator - { - GetService GetService { get; } - } + public interface IMediator : Pipelines.Pipeline.IMediator, + Pipelines.PipelineAsync.IMediator, + Pipelines.CancellablePipelineAsync.IMediator { } } \ No newline at end of file diff --git a/src/FluentMediator/IPipelineProvider.cs b/src/FluentMediator/IPipelineProvider.cs new file mode 100644 index 0000000..be0ef95 --- /dev/null +++ b/src/FluentMediator/IPipelineProvider.cs @@ -0,0 +1,6 @@ +namespace FluentMediator +{ + public interface IPipelineProvider : Pipelines.Pipeline.IPipelineProvider, + Pipelines.PipelineAsync.IPipelineProvider, + Pipelines.CancellablePipelineAsync.IPipelineProvider { } +} \ No newline at end of file diff --git a/src/FluentMediator/IPipelineProviderBuilder.cs b/src/FluentMediator/IPipelineProviderBuilder.cs new file mode 100644 index 0000000..7d4b984 --- /dev/null +++ b/src/FluentMediator/IPipelineProviderBuilder.cs @@ -0,0 +1,12 @@ +using FluentMediator.Pipelines; + +namespace FluentMediator +{ + public interface IPipelineProviderBuilder : Pipelines.Pipeline.IPipelineProviderBuilder, + Pipelines.PipelineAsync.IPipelineProviderBuilder, + Pipelines.CancellablePipelineAsync.IPipelineProviderBuilder + { + IPipelineBehavior On(); + IPipelineProvider Build(); + } +} \ No newline at end of file diff --git a/src/FluentMediator/IPipelines.cs b/src/FluentMediator/IPipelines.cs deleted file mode 100644 index 4e2df69..0000000 --- a/src/FluentMediator/IPipelines.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; -using FluentMediator.Pipelines.Pipeline; - -namespace FluentMediator -{ - public interface IPipelines - { - IPipeline GetPipeline(Type requestType); - IAsyncPipeline GetAsyncPipeline(Type requestType); - ICancellablePipeline GetCancellablePipeline(Type requestType); - } -} \ No newline at end of file diff --git a/src/FluentMediator/IPipelinesBuilder.cs b/src/FluentMediator/IPipelinesBuilder.cs deleted file mode 100644 index addeb9a..0000000 --- a/src/FluentMediator/IPipelinesBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using FluentMediator.Pipelines; -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; -using FluentMediator.Pipelines.Pipeline; - -namespace FluentMediator -{ - public interface IPipelinesBuilder - { - IPipelineBehavior On(); - IPipelineBuilder Add(IPipelineBuilder pipeline); - IAsyncPipelineBuilder Add(IAsyncPipelineBuilder asyncPipeline); - ICancellablePipelineBuilder Add(ICancellablePipelineBuilder cancellablePipeline); - IPipelines Build(); - } -} \ No newline at end of file diff --git a/src/FluentMediator/Mediator.cs b/src/FluentMediator/Mediator.cs index 885a301..c2347fb 100644 --- a/src/FluentMediator/Mediator.cs +++ b/src/FluentMediator/Mediator.cs @@ -6,11 +6,11 @@ namespace FluentMediator public sealed class Mediator : IMediator { public GetService GetService { get; } - private IPipelines _pipelines; + private IPipelineProvider _pipelines; public Mediator( GetService getService, - IPipelines pipelines) + IPipelineProvider pipelines) { GetService = getService; _pipelines = pipelines; diff --git a/src/FluentMediator/PipelinesProvider.cs b/src/FluentMediator/PipelineProvider.cs similarity index 59% rename from src/FluentMediator/PipelinesProvider.cs rename to src/FluentMediator/PipelineProvider.cs index 03c636c..4f29072 100644 --- a/src/FluentMediator/PipelinesProvider.cs +++ b/src/FluentMediator/PipelineProvider.cs @@ -1,33 +1,33 @@ using System; using FluentMediator.Pipelines; -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; +using FluentMediator.Pipelines.CancellablePipelineAsync; using FluentMediator.Pipelines.Pipeline; +using FluentMediator.Pipelines.PipelineAsync; namespace FluentMediator { - internal sealed class PipelinesProvider : IPipelines + internal sealed class PipelineProvider : IPipelineProvider { private readonly IPipelineCollection _pipelineCollection; - private readonly IPipelineCollection _asyncPipelineCollection; - private readonly IPipelineCollection _cancellablePipelineCollection; + private readonly IPipelineCollection _asyncPipelineCollection; + private readonly IPipelineCollection _cancellablePipelineCollection; - public PipelinesProvider( + public PipelineProvider( IPipelineCollection pipelineCollection, - IPipelineCollection asyncPipelineCollection, - IPipelineCollection cancellablePipelineCollection) + IPipelineCollection asyncPipelineCollection, + IPipelineCollection cancellablePipelineCollection) { _pipelineCollection = pipelineCollection; _asyncPipelineCollection = asyncPipelineCollection; _cancellablePipelineCollection = cancellablePipelineCollection; } - public IAsyncPipeline GetAsyncPipeline(Type requestType) + public IPipelineAsync GetAsyncPipeline(Type requestType) { return _asyncPipelineCollection.Get(requestType); } - public ICancellablePipeline GetCancellablePipeline(Type requestType) + public ICancellablePipelineAsync GetCancellablePipeline(Type requestType) { return _cancellablePipelineCollection.Get(requestType); } diff --git a/src/FluentMediator/PipelinesBuilder.cs b/src/FluentMediator/PipelineProviderBuilder.cs similarity index 51% rename from src/FluentMediator/PipelinesBuilder.cs rename to src/FluentMediator/PipelineProviderBuilder.cs index 8b6ee12..960657f 100644 --- a/src/FluentMediator/PipelinesBuilder.cs +++ b/src/FluentMediator/PipelineProviderBuilder.cs @@ -1,23 +1,23 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using FluentMediator.Pipelines; -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; +using FluentMediator.Pipelines.CancellablePipelineAsync; using FluentMediator.Pipelines.Pipeline; +using FluentMediator.Pipelines.PipelineAsync; namespace FluentMediator { - public sealed class PipelinesBuilder : IPipelinesBuilder + public sealed class PipelineProviderBuilder : IPipelineProviderBuilder { private ICollection _pipelineBuilderCollection { get; } - private ICollection _asyncPipelineBuilderCollection { get; } - private ICollection _cancellablePipelineBuilderCollection { get; } + private ICollection _asyncPipelineBuilderCollection { get; } + private ICollection _cancellablePipelineBuilderCollection { get; } - public PipelinesBuilder() + public PipelineProviderBuilder() { _pipelineBuilderCollection = new Collection(); - _asyncPipelineBuilderCollection = new Collection(); - _cancellablePipelineBuilderCollection = new Collection(); + _asyncPipelineBuilderCollection = new Collection(); + _cancellablePipelineBuilderCollection = new Collection(); } public IPipelineBehavior On() @@ -26,49 +26,49 @@ public IPipelineBehavior On() return behavior; } - public IPipelineBuilder Add(IPipelineBuilder pipeline) + public IPipelineBuilder Add(IPipelineBuilder pipelineBuilder) { - _pipelineBuilderCollection.Add(pipeline); - return pipeline; + _pipelineBuilderCollection.Add(pipelineBuilder); + return pipelineBuilder; } - public IAsyncPipelineBuilder Add(IAsyncPipelineBuilder asyncPipeline) + public IPipelineAsyncBuilder Add(IPipelineAsyncBuilder pipelineBuilder) { - _asyncPipelineBuilderCollection.Add(asyncPipeline); - return asyncPipeline; + _asyncPipelineBuilderCollection.Add(pipelineBuilder); + return pipelineBuilder; } - public ICancellablePipelineBuilder Add(ICancellablePipelineBuilder cancellablePipeline) + public ICancellablePipelineAsyncBuilder Add(ICancellablePipelineAsyncBuilder pipelineBuilder) { - _cancellablePipelineBuilderCollection.Add(cancellablePipeline); - return cancellablePipeline; + _cancellablePipelineBuilderCollection.Add(pipelineBuilder); + return pipelineBuilder; } - public IPipelines Build() + public IPipelineProvider Build() { var pipelineCollection = new PipelineCollection(); - var asyncPipelineCollection = new PipelineCollection(); - var cancellablePipelineCollection = new PipelineCollection(); + var asyncPipelineCollection = new PipelineCollection(); + var cancellablePipelineCollection = new PipelineCollection(); foreach (var item in _pipelineBuilderCollection) { var pipeline = item.Build(); - pipelineCollection.Add(pipeline.RequestType, pipeline); + pipelineCollection.Add(pipeline); } foreach (var item in _asyncPipelineBuilderCollection) { var pipeline = item.Build(); - asyncPipelineCollection.Add(pipeline.RequestType, pipeline); + asyncPipelineCollection.Add(pipeline); } foreach (var item in _cancellablePipelineBuilderCollection) { var pipeline = item.Build(); - cancellablePipelineCollection.Add(pipeline.RequestType, pipeline); + cancellablePipelineCollection.Add(pipeline); } - return new PipelinesProvider( + return new PipelineProvider( pipelineCollection, asyncPipelineCollection, cancellablePipelineCollection diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineBuilder.cs b/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineBuilder.cs deleted file mode 100644 index 9c01e3e..0000000 --- a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace FluentMediator.Pipelines.AsyncPipeline -{ - public interface IAsyncPipelineBuilder : IAsyncPipelineBuilder - { - IAsyncPipelineBuilder Call(Func func); - IAsyncPipeline Return(Func> func); - } - - public interface IAsyncPipelineBuilder - { - IAsyncPipeline Build(); - } -} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipelineBuilder.cs b/src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipelineBuilder.cs deleted file mode 100644 index 08a859b..0000000 --- a/src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipelineBuilder.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace FluentMediator.Pipelines.CancellablePipeline -{ - internal class CancellablePipelineBuilder : ICancellablePipelineBuilder - { - private readonly IMethodCollection>> _methods; - private ICancellableAsync _direct; - - public CancellablePipelineBuilder() - { - _methods = new MethodCollection>>(); - _direct = null!; - } - - public ICancellablePipelineBuilder Call(Func func) - { - Func typedHandler = async(h, r, c) => await func((THandler) h, (TRequest) r, c); - var method = new Method>(typeof(THandler), typedHandler); - _methods.Add(method); - return this; - } - - public ICancellablePipeline Return(Func> func) - { - _direct = new CancellableAsyncDirect(func); - return Build(); - } - - public ICancellablePipeline Build() - { - return new CancellablePipeline(_methods, _direct, typeof(TRequest)); - } - } -} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineBuilder.cs b/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineBuilder.cs deleted file mode 100644 index b567c40..0000000 --- a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineBuilder.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace FluentMediator.Pipelines.CancellablePipeline -{ - public interface ICancellablePipelineBuilder : ICancellablePipelineBuilder - { - ICancellablePipelineBuilder Call(Func func); - ICancellablePipeline Return(Func> func); - } - - public interface ICancellablePipelineBuilder - { - ICancellablePipeline Build(); - } -} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/CancellableAsyncDirect.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/Direct.cs similarity index 79% rename from src/FluentMediator/Pipelines/CancellablePipeline/CancellableAsyncDirect.cs rename to src/FluentMediator/Pipelines/CancellablePipelineAsync/Direct.cs index 9194332..f682c40 100644 --- a/src/FluentMediator/Pipelines/CancellablePipeline/CancellableAsyncDirect.cs +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/Direct.cs @@ -2,13 +2,13 @@ using System.Threading; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.CancellablePipeline +namespace FluentMediator.Pipelines.CancellablePipelineAsync { - internal sealed class CancellableAsyncDirect : ICancellableAsync + internal sealed class Direct : IDirect { private readonly Method>> _method; - public CancellableAsyncDirect(Func> action) + public Direct(Func> action) { Func> typedHandler = (h, req, ct) => action((THandler) h, (TRequest) req, ct); _method = new Method>>(typeof(THandler), typedHandler); diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipeline.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsync.cs similarity index 66% rename from src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipeline.cs rename to src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsync.cs index 695542e..afd1fea 100644 --- a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipeline.cs +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsync.cs @@ -1,12 +1,10 @@ -using System; using System.Threading; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.CancellablePipeline +namespace FluentMediator.Pipelines.CancellablePipelineAsync { - public interface ICancellablePipeline + public interface ICancellablePipelineAsync : INamedPipeline, ITypedPipeline { - Type RequestType { get; } Task PublishAsync(GetService getService, object request, CancellationToken cancellationToken); Task SendAsync(GetService getService, object request, CancellationToken cancellationToken); } diff --git a/src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsyncBuilder.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsyncBuilder.cs new file mode 100644 index 0000000..7fe042c --- /dev/null +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/ICancellablePipelineAsyncBuilder.cs @@ -0,0 +1,17 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace FluentMediator.Pipelines.CancellablePipelineAsync +{ + public interface ICancellablePipelineAsyncBuilder : ICancellablePipelineAsyncBuilder + { + ICancellablePipelineAsyncBuilder Call(Func func); + ICancellablePipelineAsync Return(Func> func); + } + + public interface ICancellablePipelineAsyncBuilder + { + ICancellablePipelineAsync Build(); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellableAsync.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IDirect.cs similarity index 66% rename from src/FluentMediator/Pipelines/CancellablePipeline/ICancellableAsync.cs rename to src/FluentMediator/Pipelines/CancellablePipelineAsync/IDirect.cs index ecfc229..b1a01ff 100644 --- a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellableAsync.cs +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IDirect.cs @@ -1,9 +1,9 @@ using System.Threading; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.CancellablePipeline +namespace FluentMediator.Pipelines.CancellablePipelineAsync { - public interface ICancellableAsync + public interface IDirect { Task SendAsync(GetService getService, object request, CancellationToken cancellationToken); } diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineMediator.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IMediator.cs similarity index 66% rename from src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineMediator.cs rename to src/FluentMediator/Pipelines/CancellablePipelineAsync/IMediator.cs index 832fef5..738f6f8 100644 --- a/src/FluentMediator/Pipelines/CancellablePipeline/ICancellablePipelineMediator.cs +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IMediator.cs @@ -1,12 +1,11 @@ using System.Threading; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.CancellablePipeline +namespace FluentMediator.Pipelines.CancellablePipelineAsync { - public interface ICancellablePipelineMediator + public interface IMediator { Task PublishAsync(object request, CancellationToken ct); - Task SendAsync(object request, CancellationToken ct); } } \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProvider.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProvider.cs new file mode 100644 index 0000000..ebb5140 --- /dev/null +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProvider.cs @@ -0,0 +1,9 @@ +using System; + +namespace FluentMediator.Pipelines.CancellablePipelineAsync +{ + public interface IPipelineProvider + { + ICancellablePipelineAsync GetCancellablePipeline(Type requestType); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProviderBuilder.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProviderBuilder.cs new file mode 100644 index 0000000..6c84a79 --- /dev/null +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/IPipelineProviderBuilder.cs @@ -0,0 +1,7 @@ +namespace FluentMediator.Pipelines.CancellablePipelineAsync +{ + public interface IPipelineProviderBuilder + { + ICancellablePipelineAsyncBuilder Add(ICancellablePipelineAsyncBuilder pipelineBuilder); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipeline.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/Pipeline.cs similarity index 70% rename from src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipeline.cs rename to src/FluentMediator/Pipelines/CancellablePipelineAsync/Pipeline.cs index 1fd5c1a..02ad739 100644 --- a/src/FluentMediator/Pipelines/CancellablePipeline/CancellablePipeline.cs +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/Pipeline.cs @@ -2,28 +2,23 @@ using System.Threading; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.CancellablePipeline +namespace FluentMediator.Pipelines.CancellablePipelineAsync { - internal sealed class CancellablePipeline : ICancellablePipeline + internal sealed class Pipeline : ICancellablePipelineAsync { private readonly IMethodCollection>> _methods; - private readonly Type _requestType; - private readonly ICancellableAsync _direct; + private readonly IDirect? _direct; - public CancellablePipeline(IMethodCollection>> methods, ICancellableAsync direct, Type requestType) + public Pipeline(IMethodCollection>> methods, IDirect? direct, Type requestType, string? name) { _methods = methods; _direct = direct; - _requestType = requestType; + RequestType = requestType; + Name = name; } - public Type RequestType - { - get - { - return _requestType; - } - } + public Type RequestType { get; } + public string? Name { get; } public async Task PublishAsync(GetService getService, object request, CancellationToken cancellationToken) { diff --git a/src/FluentMediator/Pipelines/CancellablePipelineAsync/PipelineBuilder.cs b/src/FluentMediator/Pipelines/CancellablePipelineAsync/PipelineBuilder.cs new file mode 100644 index 0000000..8fbc785 --- /dev/null +++ b/src/FluentMediator/Pipelines/CancellablePipelineAsync/PipelineBuilder.cs @@ -0,0 +1,38 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace FluentMediator.Pipelines.CancellablePipelineAsync +{ + internal class PipelineBuilder : ICancellablePipelineAsyncBuilder + { + private readonly IMethodCollection>> _methods; + private IDirect? _direct; + private string? _name; + + public PipelineBuilder(string? name) + { + _methods = new MethodCollection>>(); + _name = name; + } + + public ICancellablePipelineAsyncBuilder Call(Func func) + { + Func typedHandler = async(h, r, c) => await func((THandler) h, (TRequest) r, c); + var method = new Method>(typeof(THandler), typedHandler); + _methods.Add(method); + return this; + } + + public ICancellablePipelineAsync Return(Func> func) + { + _direct = new Direct(func); + return Build(); + } + + public ICancellablePipelineAsync Build() + { + return new Pipeline(_methods, _direct, typeof(TRequest), _name); + } + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/IMethodCollection.cs b/src/FluentMediator/Pipelines/IMethodCollection.cs index 7fc3c5e..9d1984e 100644 --- a/src/FluentMediator/Pipelines/IMethodCollection.cs +++ b/src/FluentMediator/Pipelines/IMethodCollection.cs @@ -2,7 +2,7 @@ namespace FluentMediator.Pipelines { - public interface IMethodCollection + internal interface IMethodCollection { ReadOnlyCollection GetMethods(); void Add(Method method); diff --git a/src/FluentMediator/Pipelines/INamedPipeline.cs b/src/FluentMediator/Pipelines/INamedPipeline.cs new file mode 100644 index 0000000..caa25c0 --- /dev/null +++ b/src/FluentMediator/Pipelines/INamedPipeline.cs @@ -0,0 +1,7 @@ +namespace FluentMediator.Pipelines +{ + public interface INamedPipeline + { + string? Name { get; } + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/IPipelineBehavior.cs b/src/FluentMediator/Pipelines/IPipelineBehavior.cs index 5654bae..529b1ff 100644 --- a/src/FluentMediator/Pipelines/IPipelineBehavior.cs +++ b/src/FluentMediator/Pipelines/IPipelineBehavior.cs @@ -1,13 +1,13 @@ -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; +using FluentMediator.Pipelines.CancellablePipelineAsync; using FluentMediator.Pipelines.Pipeline; +using FluentMediator.Pipelines.PipelineAsync; namespace FluentMediator.Pipelines { public interface IPipelineBehavior { - IPipelineBuilder Pipeline(); - IAsyncPipelineBuilder AsyncPipeline(); - ICancellablePipelineBuilder CancellablePipeline(); + IPipelineBuilder Pipeline(string? pipelineName = null); + IPipelineAsyncBuilder PipelineAsync(string? pipelineName = null); + ICancellablePipelineAsyncBuilder CancellablePipelineAsync(string? pipelineName = null); } } \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/IPipelineCollection.cs b/src/FluentMediator/Pipelines/IPipelineCollection.cs index 2110e74..556c4ad 100644 --- a/src/FluentMediator/Pipelines/IPipelineCollection.cs +++ b/src/FluentMediator/Pipelines/IPipelineCollection.cs @@ -3,11 +3,12 @@ namespace FluentMediator.Pipelines { - public interface IPipelineCollection : IEnumerable - where TPipeline : class + public interface IPipelineCollection + where TPipeline : class, ITypedPipeline { - void Add(TPipeline pipeline); + void Add(TPipeline pipeline); TPipeline Get(Type requestType); - bool Contains(Type messageType, out TPipeline? pipeline); + bool Contains(Type requestType, out TPipeline? pipeline); + IEnumerable ToIEnumerable(); } } \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/ITypedPipeline.cs b/src/FluentMediator/Pipelines/ITypedPipeline.cs new file mode 100644 index 0000000..a8d68fb --- /dev/null +++ b/src/FluentMediator/Pipelines/ITypedPipeline.cs @@ -0,0 +1,9 @@ +using System; + +namespace FluentMediator.Pipelines +{ + public interface ITypedPipeline + { + Type RequestType { get; } + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/Pipeline/IPipelineMediator.cs b/src/FluentMediator/Pipelines/Pipeline/IMediator.cs similarity index 78% rename from src/FluentMediator/Pipelines/Pipeline/IPipelineMediator.cs rename to src/FluentMediator/Pipelines/Pipeline/IMediator.cs index 3fbeab8..7d0101e 100644 --- a/src/FluentMediator/Pipelines/Pipeline/IPipelineMediator.cs +++ b/src/FluentMediator/Pipelines/Pipeline/IMediator.cs @@ -1,6 +1,6 @@ namespace FluentMediator.Pipelines.Pipeline { - public interface IPipelineMediator + public interface IMediator { void Publish(object request); TResult Send(object request); diff --git a/src/FluentMediator/Pipelines/Pipeline/IPipeline.cs b/src/FluentMediator/Pipelines/Pipeline/IPipeline.cs index 46344a9..018764c 100644 --- a/src/FluentMediator/Pipelines/Pipeline/IPipeline.cs +++ b/src/FluentMediator/Pipelines/Pipeline/IPipeline.cs @@ -1,10 +1,7 @@ -using System; - namespace FluentMediator.Pipelines.Pipeline { - public interface IPipeline + public interface IPipeline : INamedPipeline, ITypedPipeline { - Type RequestType { get; } void Publish(GetService getService, object request); TResult Send(GetService getService, object request); } diff --git a/src/FluentMediator/Pipelines/Pipeline/IPipelineProvider.cs b/src/FluentMediator/Pipelines/Pipeline/IPipelineProvider.cs new file mode 100644 index 0000000..c8f9aa8 --- /dev/null +++ b/src/FluentMediator/Pipelines/Pipeline/IPipelineProvider.cs @@ -0,0 +1,9 @@ +using System; + +namespace FluentMediator.Pipelines.Pipeline +{ + public interface IPipelineProvider + { + IPipeline GetPipeline(Type requestType); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/Pipeline/IPipelineProviderBuilder.cs b/src/FluentMediator/Pipelines/Pipeline/IPipelineProviderBuilder.cs new file mode 100644 index 0000000..53f3e1a --- /dev/null +++ b/src/FluentMediator/Pipelines/Pipeline/IPipelineProviderBuilder.cs @@ -0,0 +1,7 @@ +namespace FluentMediator.Pipelines.Pipeline +{ + public interface IPipelineProviderBuilder + { + IPipelineBuilder Add(IPipelineBuilder pipelineBuilder); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/Pipeline/Pipeline.cs b/src/FluentMediator/Pipelines/Pipeline/Pipeline.cs index 4d9e288..2851058 100644 --- a/src/FluentMediator/Pipelines/Pipeline/Pipeline.cs +++ b/src/FluentMediator/Pipelines/Pipeline/Pipeline.cs @@ -7,14 +7,16 @@ internal sealed class Pipeline : IPipeline private readonly IMethodCollection>> _methods; private readonly IDirect? _direct; - public Pipeline(IMethodCollection>> methods, IDirect? direct, Type requestType) + public Pipeline(IMethodCollection>> methods, IDirect? direct, Type requestType, string? name) { _methods = methods; _direct = direct; RequestType = requestType; + Name = name; } public Type RequestType { get; } + public string? Name { get; } public void Publish(GetService getService, object request) { diff --git a/src/FluentMediator/Pipelines/Pipeline/PipelineBuilder.cs b/src/FluentMediator/Pipelines/Pipeline/PipelineBuilder.cs index a22597e..58c3c86 100644 --- a/src/FluentMediator/Pipelines/Pipeline/PipelineBuilder.cs +++ b/src/FluentMediator/Pipelines/Pipeline/PipelineBuilder.cs @@ -6,10 +6,12 @@ internal sealed class PipelineBuilder : IPipelineBuilder { private readonly IMethodCollection>> _methods; private IDirect? _direct; + private string? _name; - public PipelineBuilder() + public PipelineBuilder(string? name) { _methods = new MethodCollection>>(); + _name = name; } public IPipelineBuilder Call(Action action) @@ -28,7 +30,7 @@ public IPipelineBuilder Call(Action acti public IPipeline Build() { - return new Pipeline(_methods, _direct, typeof(TRequest)); + return new Pipeline(_methods, _direct, typeof(TRequest), _name); } } } \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/DirectAsync.cs b/src/FluentMediator/Pipelines/PipelineAsync/Direct.cs similarity index 80% rename from src/FluentMediator/Pipelines/AsyncPipeline/DirectAsync.cs rename to src/FluentMediator/Pipelines/PipelineAsync/Direct.cs index 41fd255..13991fc 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/DirectAsync.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/Direct.cs @@ -1,13 +1,13 @@ using System; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - internal sealed class DirectAsync : IDirectAsync + internal sealed class Direct : IDirect { private readonly Method>> _method; - public DirectAsync(Func> action) + public Direct(Func> action) { Func> typedHandler = (h, req) => action((THandler) h, (TRequest) req); _method = new Method>>(typeof(THandler), typedHandler); diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/IDirectAsync.cs b/src/FluentMediator/Pipelines/PipelineAsync/IDirect.cs similarity index 60% rename from src/FluentMediator/Pipelines/AsyncPipeline/IDirectAsync.cs rename to src/FluentMediator/Pipelines/PipelineAsync/IDirect.cs index a3cdbd2..34498ee 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/IDirectAsync.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/IDirect.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - public interface IDirectAsync + internal interface IDirect { Task SendAsync(GetService getService, object request); } diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineMediator.cs b/src/FluentMediator/Pipelines/PipelineAsync/IMediator.cs similarity index 60% rename from src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineMediator.cs rename to src/FluentMediator/Pipelines/PipelineAsync/IMediator.cs index 4d00824..dac1274 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipelineMediator.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/IMediator.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - public interface IAsyncPipelineMediator + public interface IMediator { Task PublishAsync(object request); Task SendAsync(object request); diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipeline.cs b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsync.cs similarity index 58% rename from src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipeline.cs rename to src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsync.cs index d78047e..b0e16b0 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/IAsyncPipeline.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsync.cs @@ -1,11 +1,9 @@ -using System; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - public interface IAsyncPipeline + public interface IPipelineAsync : INamedPipeline, ITypedPipeline { - Type RequestType { get; } Task PublishAsync(GetService getService, object request); Task SendAsync(GetService getService, object request); } diff --git a/src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsyncBuilder.cs b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsyncBuilder.cs new file mode 100644 index 0000000..a1caf0f --- /dev/null +++ b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineAsyncBuilder.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading.Tasks; + +namespace FluentMediator.Pipelines.PipelineAsync +{ + public interface IPipelineAsyncBuilder : IPipelineAsyncBuilder + { + IPipelineAsyncBuilder Call(Func func); + IPipelineAsync Return(Func> func); + } + + public interface IPipelineAsyncBuilder + { + IPipelineAsync Build(); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProvider.cs b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProvider.cs new file mode 100644 index 0000000..73d52ad --- /dev/null +++ b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProvider.cs @@ -0,0 +1,9 @@ +using System; + +namespace FluentMediator.Pipelines.PipelineAsync +{ + public interface IPipelineProvider + { + IPipelineAsync GetAsyncPipeline(Type requestType); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProviderBuilder.cs b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProviderBuilder.cs new file mode 100644 index 0000000..3ff0ceb --- /dev/null +++ b/src/FluentMediator/Pipelines/PipelineAsync/IPipelineProviderBuilder.cs @@ -0,0 +1,7 @@ +namespace FluentMediator.Pipelines.PipelineAsync +{ + public interface IPipelineProviderBuilder + { + IPipelineAsyncBuilder Add(IPipelineAsyncBuilder pipelineBuilder); + } +} \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipeline.cs b/src/FluentMediator/Pipelines/PipelineAsync/Pipeline.cs similarity index 69% rename from src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipeline.cs rename to src/FluentMediator/Pipelines/PipelineAsync/Pipeline.cs index f968f05..82f8e7d 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipeline.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/Pipeline.cs @@ -1,28 +1,23 @@ using System; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - internal sealed class AsyncPipeline : IAsyncPipeline + internal sealed class Pipeline : IPipelineAsync { private readonly IMethodCollection>> _methods; - private readonly IDirectAsync _direct; - private readonly Type _requestType; + private readonly IDirect? _direct; - public AsyncPipeline(IMethodCollection>> methods, IDirectAsync direct, Type requestType) + public Pipeline(IMethodCollection>> methods, IDirect? direct, Type requestType, string? name) { _methods = methods; _direct = direct; - _requestType = requestType; + RequestType = requestType; + Name = name; } - public Type RequestType - { - get - { - return _requestType; - } - } + public Type RequestType { get; } + public string? Name { get; } public async Task PublishAsync(GetService getService, object request) { diff --git a/src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipelineBuilder.cs b/src/FluentMediator/Pipelines/PipelineAsync/PipelineBuilder.cs similarity index 53% rename from src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipelineBuilder.cs rename to src/FluentMediator/Pipelines/PipelineAsync/PipelineBuilder.cs index 1ef4656..2ce15bd 100644 --- a/src/FluentMediator/Pipelines/AsyncPipeline/AsyncPipelineBuilder.cs +++ b/src/FluentMediator/Pipelines/PipelineAsync/PipelineBuilder.cs @@ -1,20 +1,21 @@ using System; using System.Threading.Tasks; -namespace FluentMediator.Pipelines.AsyncPipeline +namespace FluentMediator.Pipelines.PipelineAsync { - internal sealed class AsyncPipelineBuilder : IAsyncPipelineBuilder + internal sealed class PipelineBuilder : IPipelineAsyncBuilder { private readonly IMethodCollection>> _methods; - private IDirectAsync _direct; + private IDirect? _direct; + private string? _name; - public AsyncPipelineBuilder() + public PipelineBuilder(string? name) { _methods = new MethodCollection>>(); - _direct = null!; + _name = name; } - public IAsyncPipelineBuilder Call(Func func) + public IPipelineAsyncBuilder Call(Func func) { Func typedHandler = async(h, r) => await func((THandler) h, (TRequest) r); var method = new Method>(typeof(THandler), typedHandler); @@ -22,15 +23,15 @@ public IAsyncPipelineBuilder Call(Func(Func> func) + public IPipelineAsync Return(Func> func) { - _direct = new DirectAsync(func); + _direct = new Direct(func); return Build(); } - public IAsyncPipeline Build() + public IPipelineAsync Build() { - return new AsyncPipeline(_methods, _direct, typeof(TRequest)); + return new Pipeline(_methods, _direct, typeof(TRequest), _name); } } } \ No newline at end of file diff --git a/src/FluentMediator/Pipelines/PipelineBehavior.cs b/src/FluentMediator/Pipelines/PipelineBehavior.cs index c3d2e20..9372dc2 100644 --- a/src/FluentMediator/Pipelines/PipelineBehavior.cs +++ b/src/FluentMediator/Pipelines/PipelineBehavior.cs @@ -1,36 +1,36 @@ -using FluentMediator.Pipelines.AsyncPipeline; -using FluentMediator.Pipelines.CancellablePipeline; +using FluentMediator.Pipelines.CancellablePipelineAsync; using FluentMediator.Pipelines.Pipeline; +using FluentMediator.Pipelines.PipelineAsync; namespace FluentMediator.Pipelines { internal sealed class PipelineBehavior : IPipelineBehavior { - private readonly IPipelinesBuilder _mediatorBuilder; + private readonly IPipelineProviderBuilder _pipelineProviderBuilder; - public PipelineBehavior(IPipelinesBuilder mediatorBuilder) + public PipelineBehavior(IPipelineProviderBuilder pipelineProviderBuilder) { - _mediatorBuilder = mediatorBuilder; + _pipelineProviderBuilder = pipelineProviderBuilder; } - public IPipelineBuilder Pipeline() + public IPipelineBuilder Pipeline(string? pipelineName = null) { - var pipelineBuilder = new PipelineBuilder(); - _mediatorBuilder.Add(pipelineBuilder); + var pipelineBuilder = new Pipeline.PipelineBuilder(pipelineName); + _pipelineProviderBuilder.Add(pipelineBuilder); return pipelineBuilder; } - public IAsyncPipelineBuilder AsyncPipeline() + public IPipelineAsyncBuilder PipelineAsync(string? pipelineName = null) { - var pipelineBuilder = new AsyncPipelineBuilder(); - _mediatorBuilder.Add(pipelineBuilder); + var pipelineBuilder = new PipelineAsync.PipelineBuilder(pipelineName); + _pipelineProviderBuilder.Add(pipelineBuilder); return pipelineBuilder; } - public ICancellablePipelineBuilder CancellablePipeline() + public ICancellablePipelineAsyncBuilder CancellablePipelineAsync(string? pipelineName = null) { - var pipelineBuilder = new CancellablePipelineBuilder(); - _mediatorBuilder.Add(pipelineBuilder); + var pipelineBuilder = new CancellablePipelineAsync.PipelineBuilder(pipelineName); + _pipelineProviderBuilder.Add(pipelineBuilder); return pipelineBuilder; } } diff --git a/src/FluentMediator/Pipelines/PipelineCollection.cs b/src/FluentMediator/Pipelines/PipelineCollection.cs index bdae2c9..65a98df 100644 --- a/src/FluentMediator/Pipelines/PipelineCollection.cs +++ b/src/FluentMediator/Pipelines/PipelineCollection.cs @@ -1,11 +1,12 @@ using System; -using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; namespace FluentMediator.Pipelines { internal sealed class PipelineCollection : IPipelineCollection - where TPipeline : class + where TPipeline : class, ITypedPipeline { private readonly IDictionary _pipelines; @@ -14,34 +15,24 @@ public PipelineCollection() _pipelines = new Dictionary(); } - public void Add(Type requestType, TPipeline pipeline) + public void Add(TPipeline pipeline) { - if (_pipelines.ContainsKey(requestType)) + if (_pipelines.ContainsKey(pipeline.RequestType)) { - throw new PipelineAlreadyExistsException($"A pipeline for `{ requestType }` already exists."); + throw new PipelineAlreadyExistsException($"A pipeline for `{ pipeline.RequestType }` already exists."); } - _pipelines.Add(requestType, pipeline); + _pipelines.Add(pipeline.RequestType, pipeline); } - public void Add(TPipeline pipeline) + public TPipeline Get(Type requestType) { - if (_pipelines.ContainsKey(typeof(TRequest))) - { - throw new PipelineAlreadyExistsException($"A pipeline for `{ typeof(TRequest) }` already exists."); - } - - _pipelines.Add(typeof(TRequest), pipeline); - } - - public TPipeline Get(Type request) - { - if (_pipelines.TryGetValue(request, out var pipeline)) + if (_pipelines.TryGetValue(requestType, out var pipeline)) { return pipeline; } - throw new PipelineNotFoundException($"There is no pipeline configured for `{ request.GetType() }`."); + throw new PipelineNotFoundException($"There is no pipeline configured for `{ requestType.GetType() }`."); } public bool Contains(Type requestType, out TPipeline? pipeline) @@ -56,14 +47,9 @@ public bool Contains(Type requestType, out TPipeline? pipeline) return true; } - public IEnumerator GetEnumerator() - { - return _pipelines.Values.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() + public IEnumerable ToIEnumerable() { - return _pipelines.Values.GetEnumerator(); + return new ReadOnlyCollection(_pipelines.Values.ToList()); } } } \ No newline at end of file diff --git a/src/FluentMediator/icon.png b/src/FluentMediator/icon.png deleted file mode 100644 index 9696d2d28362b110a4d3c3dc1eea5802b2328563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4561 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 diff --git a/test/UnitTests/BuildingMediatorTests.cs b/test/UnitTests/BuildingMediatorTests.cs index 92a0421..f6a5335 100644 --- a/test/UnitTests/BuildingMediatorTests.cs +++ b/test/UnitTests/BuildingMediatorTests.cs @@ -1,37 +1,32 @@ using System; -using System.Threading; -using System.Threading.Tasks; using FluentMediator; using FluentMediator.Pipelines; using Microsoft.Extensions.DependencyInjection; -using Moq; using UnitTests.PingPong; using Xunit; namespace UnitTests { - public class BuildPipelineTests + public class BuildingMediatorTests { [Fact] - public void BuildSendAsyncPipeline_ThrowsException() + public void BuildSendAsyncPipeline_ThrowsPipelineAlreadyExistsException() { var services = new ServiceCollection(); - Exception ex = Record.Exception(() => - { - services.AddFluentMediator(m => - { - m.On().AsyncPipeline() - .Return( - (handler, req) => handler.MyCustomFooBarAsync(req) - ); + + var pipelineProviderBuilder = new PipelineProviderBuilder(); - m.On().AsyncPipeline() - .Return( - (handler, req) => handler.MyCustomFooBarAsync(req) - ); + pipelineProviderBuilder.On().PipelineAsync() + .Return( + (handler, req) => handler.MyCustomFooBarAsync(req) + ); - }); - }); + pipelineProviderBuilder.On().PipelineAsync() + .Return( + (handler, req) => handler.MyCustomFooBarAsync(req) + ); + + Exception ex = Record.Exception(() => pipelineProviderBuilder.Build()); Assert.NotNull(ex); Assert.IsType(ex); diff --git a/test/UnitTests/PublishingRequestsTests.cs b/test/UnitTests/PublishingRequestsTests.cs index 2ed80e0..b9f05ab 100644 --- a/test/UnitTests/PublishingRequestsTests.cs +++ b/test/UnitTests/PublishingRequestsTests.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; using FluentMediator; @@ -15,9 +14,9 @@ public sealed class PublishingRequestsTests public void Publish_Calls_Pipeline_Handlers() { var services = new ServiceCollection(); - services.AddFluentMediator(m => + services.AddFluentMediator(builder => { - m.On().Pipeline() + builder.On().Pipeline() .Call((handler, req) => handler.MyCustomFooMethod(req)) .Call((handler, req) => handler.MyCustomBarMethod(req)); }); @@ -42,10 +41,10 @@ public void Publish_Calls_Pipeline_Handlers() public async Task PublishAsync_Calls_AsyncPipeline_Handlers() { var services = new ServiceCollection(); - services.AddFluentMediator(m => + services.AddFluentMediator(builder => { - m.On().AsyncPipeline() - .Call(async(handler, req) => await handler.MyCustomFooBarAsync(req)) + builder.On().PipelineAsync() + .Call(async (handler, req) => await handler.MyCustomFooBarAsync(req)) .Build(); }); var pingHandler = new Mock(); @@ -69,10 +68,10 @@ public async Task PublishAsync_Calls_CancellablePipeline_Handlers() { var services = new ServiceCollection(); - services.AddFluentMediator(m => + services.AddFluentMediator(builder => { - m.On().CancellablePipeline() - .Call(async(handler, req, ct) => await handler.MyCancellableForAsync(req, ct)) + builder.On().CancellablePipelineAsync() + .Call(async (handler, req, ct) => await handler.MyCancellableForAsync(req, ct)) .Build(); }); var pingHandler = new Mock(); @@ -96,12 +95,12 @@ public async Task PublishAsync_Calls_CancellablePipeline_Handlers() public async Task PublishAsync_Calls_CancellablePipeline_Handlers2() { var services = new ServiceCollection(); - services.AddFluentMediator(m => + services.AddFluentMediator(builder => { - m.On().CancellablePipeline() - .Call(async(handler, req, ct) => await handler.MyCancellableForAsync(req, ct)) + builder.On().CancellablePipelineAsync() + .Call(async (handler, req, ct) => await handler.MyCancellableForAsync(req, ct)) .Return( - async(handler, req, ct) => await handler.MyCancellableForAsync(req, ct) + async (handler, req, ct) => await handler.MyCancellableForAsync(req, ct) ); }); var pingHandler = new Mock(); diff --git a/test/UnitTests/SendingRequestTests.cs b/test/UnitTests/SendingRequestTests.cs index 6f286e3..0e7ffe9 100644 --- a/test/UnitTests/SendingRequestTests.cs +++ b/test/UnitTests/SendingRequestTests.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; using FluentMediator; @@ -46,7 +45,7 @@ public void SendAsync_Without_Return_Throws_ReturnFunctionIsNullException() var services = new ServiceCollection(); services.AddFluentMediator(m => { - m.On().AsyncPipeline() + m.On().PipelineAsync() .Call((handler, req) => handler.MyCustomFooBarAsync(req)) .Call((handler, req) => handler.MyCustomFooBarAsync(req)); }); @@ -62,7 +61,7 @@ public void SendAsync_Without_Return_Throws_ReturnFunctionIsNullException() // // Act // - async() => await mediator.SendAsync(ping) + async () => await mediator.SendAsync(ping) ); Assert.IsType(actualEx.Result); @@ -77,7 +76,7 @@ public void CancellableSendAsync_Without_Return_Throws_ReturnFunctionIsNullExcep var services = new ServiceCollection(); services.AddFluentMediator(m => { - m.On().CancellablePipeline() + m.On().CancellablePipelineAsync() .Call((handler, req, ct) => handler.MyCancellableForAsync(req, ct)) .Call((handler, req, ct) => handler.MyCancellableForAsync(req, ct)); }); @@ -94,7 +93,7 @@ public void CancellableSendAsync_Without_Return_Throws_ReturnFunctionIsNullExcep // // Act // - async() => await mediator.SendAsync(ping, cts.Token) + async () => await mediator.SendAsync(ping, cts.Token) ); Assert.IsType(actualEx.Result); @@ -106,7 +105,7 @@ public async Task SendAsync_Returns_Response() var services = new ServiceCollection(); services.AddFluentMediator(m => { - m.On().AsyncPipeline() + m.On().PipelineAsync() .Return( (handler, req) => handler.MyCustomFooBarAsync(req) );