wip
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
namespace Toolkit.Foundation;
|
||||
|
||||
public delegate Task<TResponse> AsyncHandlerDelegate<TResponse>();
|
||||
@@ -19,16 +19,11 @@ public class AsyncHandlerInitialization<TMessage, TResponse, THandler>(IServiceP
|
||||
|
||||
foreach (IAsyncHandler<TMessage, TResponse> handler in handlers)
|
||||
{
|
||||
AsyncHandlerDelegate<TResponse> handlerDelegate = () =>
|
||||
handler.Handle(args.Message, args.CancellationToken);
|
||||
Task<TResponse> ExecutePipeline(int index) =>index < 0
|
||||
? handler.Handle(args.Message, args.CancellationToken)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1));
|
||||
|
||||
foreach (IAsyncPipelineBehavior<TMessage, TResponse>? behavior in behaviors.Reverse())
|
||||
{
|
||||
AsyncHandlerDelegate<TResponse> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
}
|
||||
|
||||
args.Reply(handlerDelegate());
|
||||
args.Reply(ExecutePipeline(behaviors.Count() - 1));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -47,21 +42,15 @@ public class AsyncHandlerInitialization<TMessage, THandler>(IServiceProvider pro
|
||||
(provider, args) =>
|
||||
{
|
||||
IEnumerable<IAsyncHandler<TMessage>> handlers = provider.GetServices<IAsyncHandler<TMessage>>();
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage, Unit>> behaviors = provider.GetServices<IAsyncPipelineBehavior<TMessage, Unit>>();
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage>> behaviors = provider.GetServices<IAsyncPipelineBehavior<TMessage>>();
|
||||
|
||||
foreach (IAsyncHandler<TMessage> handler in handlers)
|
||||
{
|
||||
AsyncHandlerDelegate<Unit> handlerDelegate = () =>
|
||||
handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value);
|
||||
Task<Unit> ExecutePipeline(int index) => index < 0
|
||||
? handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1)).ContinueWith(_ => Unit.Value);
|
||||
|
||||
foreach (IAsyncPipelineBehavior<TMessage, Unit> behavior in behaviors.Reverse())
|
||||
{
|
||||
AsyncHandlerDelegate<Unit> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
args.Reply(Unit.Value);
|
||||
args.Reply(ExecutePipeline(behaviors.Count() - 1));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -15,21 +15,15 @@ public class AsyncHandlerKeyedInitialization<TMessage, THandler>(string key, ISe
|
||||
(provider, args) =>
|
||||
{
|
||||
IEnumerable<IAsyncHandler<TMessage>> handlers = provider.GetKeyedServices<IAsyncHandler<TMessage>>(key);
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage, Unit>> behaviors = provider.GetServices<IAsyncPipelineBehavior<TMessage, Unit>>();
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage>> behaviors = provider.GetKeyedServices<IAsyncPipelineBehavior<TMessage>>(key);
|
||||
|
||||
foreach (IAsyncHandler<TMessage> handler in handlers)
|
||||
{
|
||||
AsyncHandlerDelegate<Unit> handlerDelegate = () =>
|
||||
handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value);
|
||||
Task<Unit> ExecutePipeline(int index) => index < 0
|
||||
? handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1)).ContinueWith(_ => Unit.Value);
|
||||
|
||||
foreach (IAsyncPipelineBehavior<TMessage, Unit> behavior in behaviors.Reverse())
|
||||
{
|
||||
AsyncHandlerDelegate<Unit> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
args.Reply(Unit.Value);
|
||||
args.Reply(ExecutePipeline(behaviors.Count() - 1));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -48,20 +42,15 @@ public class AsyncHandlerKeyedInitialization<TMessage, TResponse, THandler>(stri
|
||||
(provider, args) =>
|
||||
{
|
||||
IEnumerable<IAsyncHandler<TMessage, TResponse>> handlers = provider.GetKeyedServices<IAsyncHandler<TMessage, TResponse>>(key);
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage, TResponse>> behaviors = provider.GetServices<IAsyncPipelineBehavior<TMessage, TResponse>>();
|
||||
IEnumerable<IAsyncPipelineBehavior<TMessage, TResponse>> behaviors = provider.GetKeyedServices<IAsyncPipelineBehavior<TMessage, TResponse>>(key);
|
||||
|
||||
foreach (IAsyncHandler<TMessage, TResponse> handler in handlers)
|
||||
{
|
||||
AsyncHandlerDelegate<TResponse> handlerDelegate = () =>
|
||||
handler.Handle(args.Message, args.CancellationToken);
|
||||
Task<TResponse> ExecutePipeline(int index) => index < 0
|
||||
? handler.Handle(args.Message, args.CancellationToken)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1));
|
||||
|
||||
foreach (IAsyncPipelineBehavior<TMessage, TResponse> behavior in behaviors.Reverse())
|
||||
{
|
||||
AsyncHandlerDelegate<TResponse> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
}
|
||||
|
||||
args.Reply(handlerDelegate());
|
||||
args.Reply(ExecutePipeline(behaviors.Count() - 1));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
namespace Toolkit.Foundation;
|
||||
|
||||
public delegate TResponse HandlerDelegate<TResponse>();
|
||||
@@ -17,28 +17,20 @@ public class HandlerInitialization<TMessage, TResponse, THandler>(IServiceProvid
|
||||
IEnumerable<IHandler<TMessage, TResponse>> handlers = provider.GetServices<IHandler<TMessage, TResponse>>();
|
||||
IEnumerable<IPipelineBehavior<TMessage, TResponse>> behaviors = provider.GetServices<IPipelineBehavior<TMessage, TResponse>>();
|
||||
|
||||
HandlerDelegate<TResponse> handlerDelegate = () =>
|
||||
{
|
||||
TResponse response = default!;
|
||||
foreach (IHandler<TMessage, TResponse> handler in handlers)
|
||||
{
|
||||
response = handler.Handle(args.Message);
|
||||
}
|
||||
return response;
|
||||
};
|
||||
TResponse ExecutePipeline(int index) => index < 0
|
||||
? handler.Handle(args.Message)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1));
|
||||
|
||||
foreach (IPipelineBehavior<TMessage, TResponse> behavior in behaviors.Reverse())
|
||||
{
|
||||
HandlerDelegate<TResponse> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
ExecutePipeline(behaviors.Count() - 1);
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class HandlerInitialization<TMessage, THandler>(IServiceProvider provider) :
|
||||
IInitialization where THandler : class, IHandler<TMessage>
|
||||
where TMessage : class
|
||||
@@ -51,26 +43,28 @@ public class HandlerInitialization<TMessage, THandler>(IServiceProvider provider
|
||||
(provider, args) =>
|
||||
{
|
||||
IEnumerable<IHandler<TMessage>> handlers = provider.GetServices<IHandler<TMessage>>();
|
||||
IEnumerable<IPipelineBehavior<TMessage, Unit>> behaviors = provider.GetServices<IPipelineBehavior<TMessage, Unit>>();
|
||||
IEnumerable<IPipelineBehavior<TMessage>> behaviors = provider.GetServices<IPipelineBehavior<TMessage>>();
|
||||
|
||||
HandlerDelegate<Unit> handlerDelegate = () =>
|
||||
{
|
||||
foreach (IHandler<TMessage> handler in handlers)
|
||||
{
|
||||
handler.Handle(args);
|
||||
}
|
||||
return Unit.Value;
|
||||
};
|
||||
|
||||
foreach (IPipelineBehavior<TMessage, Unit> behavior in behaviors.Reverse())
|
||||
void ExecutePipeline(int index)
|
||||
{
|
||||
HandlerDelegate<Unit> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args, next);
|
||||
if (index < 0)
|
||||
{
|
||||
handler.Handle(args);
|
||||
return;
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
behaviors.ElementAt(index).Handle(args, () =>
|
||||
{
|
||||
ExecutePipeline(index - 1);
|
||||
return Unit.Value;
|
||||
});
|
||||
}
|
||||
|
||||
ExecutePipeline(behaviors.Count() - 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,30 +15,32 @@ public class HandlerKeyedInitialization<TMessage, THandler>(string key, IService
|
||||
(provider, args) =>
|
||||
{
|
||||
IEnumerable<IHandler<TMessage>> handlers = provider.GetKeyedServices<IHandler<TMessage>>(key);
|
||||
IEnumerable<IPipelineBehavior<TMessage, Unit>> behaviors = provider.GetServices<IPipelineBehavior<TMessage, Unit>>();
|
||||
IEnumerable<IPipelineBehavior<TMessage>> behaviors = provider.GetServices<IPipelineBehavior<TMessage>>();
|
||||
|
||||
HandlerDelegate<Unit> handlerDelegate = () =>
|
||||
{
|
||||
foreach (IHandler<TMessage> handler in handlers)
|
||||
{
|
||||
handler.Handle(args);
|
||||
}
|
||||
return Unit.Value;
|
||||
};
|
||||
|
||||
foreach (IPipelineBehavior<TMessage, Unit> behavior in behaviors.Reverse())
|
||||
void ExecutePipeline(int index)
|
||||
{
|
||||
HandlerDelegate<Unit> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args, next);
|
||||
if (index < 0)
|
||||
{
|
||||
handler.Handle(args);
|
||||
return;
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
behaviors.ElementAt(index).Handle(args, () =>
|
||||
{
|
||||
ExecutePipeline(index - 1);
|
||||
return Unit.Value;
|
||||
});
|
||||
}
|
||||
|
||||
ExecutePipeline(behaviors.Count() - 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class HandlerKeyedInitialization<TMessage, TResponse, THandler>(string key, IServiceProvider provider) :
|
||||
IInitialization where THandler : class, IHandler<TMessage, TResponse>
|
||||
where TMessage : class
|
||||
@@ -53,23 +55,14 @@ public class HandlerKeyedInitialization<TMessage, TResponse, THandler>(string ke
|
||||
IEnumerable<IHandler<TMessage, TResponse>> handlers = provider.GetKeyedServices<IHandler<TMessage, TResponse>>(key);
|
||||
IEnumerable<IPipelineBehavior<TMessage, TResponse>> behaviors = provider.GetServices<IPipelineBehavior<TMessage, TResponse>>();
|
||||
|
||||
HandlerDelegate<TResponse> handlerDelegate = () =>
|
||||
{
|
||||
TResponse response = default!;
|
||||
foreach (IHandler<TMessage, TResponse> handler in handlers)
|
||||
{
|
||||
response = handler.Handle(args.Message);
|
||||
}
|
||||
return response;
|
||||
};
|
||||
TResponse ExecutePipeline(int index) => index < 0
|
||||
? handler.Handle(args.Message)
|
||||
: behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1));
|
||||
|
||||
foreach (IPipelineBehavior<TMessage, TResponse> behavior in behaviors.Reverse())
|
||||
{
|
||||
HandlerDelegate<TResponse> next = handlerDelegate;
|
||||
handlerDelegate = () => behavior.Handle(args.Message, next);
|
||||
ExecutePipeline(behaviors.Count() - 1);
|
||||
}
|
||||
|
||||
handlerDelegate();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,13 @@
|
||||
public interface IAsyncHandler<TMessage, TResponse> :
|
||||
IHandler
|
||||
{
|
||||
Task<TResponse> Handle(TMessage args, CancellationToken cancellationToken = default);
|
||||
Task<TResponse> Handle(TMessage args,
|
||||
CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
public interface IAsyncHandler<TMessage> :
|
||||
IHandler
|
||||
{
|
||||
Task Handle(TMessage args, CancellationToken cancellationToken = default);
|
||||
Task Handle(TMessage args,
|
||||
CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
@@ -4,5 +4,11 @@ public interface IAsyncPipelineBehavior<TMessage,
|
||||
TResponse>
|
||||
{
|
||||
Task<TResponse> Handle(TMessage message,
|
||||
AsyncHandlerDelegate<TResponse> next);
|
||||
Func<Task<TResponse>> next);
|
||||
}
|
||||
|
||||
public interface IAsyncPipelineBehavior<TMessage>
|
||||
{
|
||||
Task Handle(TMessage message,
|
||||
Func<Task> next);
|
||||
}
|
||||
@@ -4,6 +4,11 @@ public interface IPipelineBehavior<TMessage,
|
||||
TResponse>
|
||||
{
|
||||
TResponse Handle(TMessage message,
|
||||
HandlerDelegate<TResponse> next);
|
||||
Func<TResponse> next);
|
||||
}
|
||||
|
||||
public interface IPipelineBehavior<TMessage>
|
||||
{
|
||||
void Handle(TMessage message,
|
||||
Func<Unit> next);
|
||||
}
|
||||
@@ -163,23 +163,25 @@ public static class IServiceCollectionExtensions
|
||||
where TInitialization : class,
|
||||
IInitialization
|
||||
{
|
||||
services.AddTransient<IInitialization>(provider => provider.GetRequiredService<IServiceFactory>().Create<TInitialization>(parameters));
|
||||
services.AddTransient<IInitialization>(provider => provider.GetRequiredService<IServiceFactory>()
|
||||
.Create<TInitialization>(parameters));
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
public static IServiceCollection AddAsyncPipelineBehavior<TMessage, TResponse, TBehavior>(this IServiceCollection services)
|
||||
where TBehavior : class,
|
||||
IAsyncPipelineBehavior<TMessage, TResponse>
|
||||
public static IServiceCollection AddAsyncPipelineBehavior(this IServiceCollection services,
|
||||
Type behaviorType,
|
||||
string? key = null)
|
||||
{
|
||||
services.AddTransient<IAsyncPipelineBehavior<TMessage, TResponse>, TBehavior>();
|
||||
return services;
|
||||
if (key is { Length: > 0 })
|
||||
{
|
||||
services.AddKeyedTransient(typeof(IAsyncPipelineBehavior<>), key, behaviorType);
|
||||
}
|
||||
else
|
||||
{
|
||||
services.AddTransient(typeof(IAsyncPipelineBehavior<>), behaviorType);
|
||||
}
|
||||
|
||||
public static IServiceCollection AddPipelineBehavior<TMessage, TResponse, TBehavior>(this IServiceCollection services)
|
||||
where TBehavior : class,
|
||||
IPipelineBehavior<TMessage, TResponse>
|
||||
{
|
||||
services.AddTransient<IPipelineBehavior<TMessage, TResponse>, TBehavior>();
|
||||
return services;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user