From f34668093bbb1cc9cab4955b0216f8120392360c Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 9 Jul 2021 17:29:44 +0500 Subject: [PATCH 01/14] remade all pipes build cycle from collecting types of middleware to creating collection of middleware and running through it. Also added configuration lambda for middleware in every Add function of pipelines and in every Chain functions of ResponsabilityChain --- src/PipelineNet.Tests/.vscode/launch.json | 26 +++++++ src/PipelineNet.Tests/.vscode/tasks.json | 42 +++++++++++ .../AsyncResponsibilityChainTests.cs | 48 +------------ .../ResponsibilityChainTests.cs | 44 +----------- .../PipelineNet.Tests.csproj | 19 ++--- .../Pipelines/AsyncPipelineTests.cs | 39 +---------- .../Pipelines/PipelineTests.cs | 43 ++---------- src/PipelineNet.Tests/log.txt | 0 src/PipelineNet/BaseMiddlewareFlow.cs | 40 +---------- .../AsyncResponsibilityChain.cs | 67 +++++------------- .../IAsyncResponsibilityChain.cs | 15 +--- .../IResponsibilityChain.cs | 15 +--- .../ResponsibilityChain.cs | 68 ++++++------------ .../Middleware/IAsyncMiddleware.WithReturn.cs | 4 +- ...ithReturn.cs => IMiddleware.WithResult.cs} | 4 +- .../ActivatorMiddlewareResolver.cs | 16 ----- .../MiddlewareResolver/IMiddlewareResolver.cs | 18 ----- src/PipelineNet/PipelineNet.csproj | 2 +- src/PipelineNet/Pipelines/AsyncPipeline.cs | 51 ++++---------- src/PipelineNet/Pipelines/IAsyncPipeline.cs | 13 +--- src/PipelineNet/Pipelines/IPipeline.cs | 13 +--- src/PipelineNet/Pipelines/Pipeline.cs | 69 ++++++++----------- 22 files changed, 184 insertions(+), 472 deletions(-) create mode 100644 src/PipelineNet.Tests/.vscode/launch.json create mode 100644 src/PipelineNet.Tests/.vscode/tasks.json create mode 100644 src/PipelineNet.Tests/log.txt rename src/PipelineNet/Middleware/{IMiddleware.WithReturn.cs => IMiddleware.WithResult.cs} (90%) delete mode 100644 src/PipelineNet/MiddlewareResolver/ActivatorMiddlewareResolver.cs delete mode 100644 src/PipelineNet/MiddlewareResolver/IMiddlewareResolver.cs diff --git a/src/PipelineNet.Tests/.vscode/launch.json b/src/PipelineNet.Tests/.vscode/launch.json new file mode 100644 index 0000000..fd139b9 --- /dev/null +++ b/src/PipelineNet.Tests/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/bin/Debug/netcoreapp2.1/PipelineNet.Tests.dll", + "args": [], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/src/PipelineNet.Tests/.vscode/tasks.json b/src/PipelineNet.Tests/.vscode/tasks.json new file mode 100644 index 0000000..1143064 --- /dev/null +++ b/src/PipelineNet.Tests/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/PipelineNet.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/PipelineNet.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/PipelineNet.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/src/PipelineNet.Tests/ChainsOfResponsibility/AsyncResponsibilityChainTests.cs b/src/PipelineNet.Tests/ChainsOfResponsibility/AsyncResponsibilityChainTests.cs index 2dcb5b2..725d53c 100644 --- a/src/PipelineNet.Tests/ChainsOfResponsibility/AsyncResponsibilityChainTests.cs +++ b/src/PipelineNet.Tests/ChainsOfResponsibility/AsyncResponsibilityChainTests.cs @@ -1,6 +1,5 @@ using PipelineNet.ChainsOfResponsibility; using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; using System.Threading.Tasks; using Xunit; @@ -93,7 +92,7 @@ public async Task Run(Exception exception, Func> exe [Fact] public async Task Execute_CreateChainOfMiddlewareToHandleException_TheRightMiddleHandlesTheException() { - var responsibilityChain = new AsyncResponsibilityChain(new ActivatorMiddlewareResolver()) + var responsibilityChain = new AsyncResponsibilityChain() .Chain() .Chain() .Chain(); @@ -113,7 +112,7 @@ public async Task Execute_CreateChainOfMiddlewareToHandleException_TheRightMiddl [Fact] public async Task Execute_ChainOfMiddlewareThatDoesNotHandleTheException_ChainReturnsDefaultValue() { - var responsibilityChain = new AsyncResponsibilityChain(new ActivatorMiddlewareResolver()) + var responsibilityChain = new AsyncResponsibilityChain() .Chain() .Chain() .Chain(); @@ -127,54 +126,13 @@ public async Task Execute_ChainOfMiddlewareThatDoesNotHandleTheException_ChainRe Assert.Equal(default(bool), result); } - [Fact] - public async Task Execute_ChainOfMiddlewareWithFinallyFunc_FinallyFuncIsExecuted() - { - const string ExceptionSource = "EXCEPTION_SOURCE"; - - var responsibilityChain = new AsyncResponsibilityChain(new ActivatorMiddlewareResolver()) - .Chain() - .Chain(typeof(InvalidateDataExceptionHandler)) - .Chain() - .Finally((ex) => - { - ex.Source = ExceptionSource; - return Task.FromResult(true); - }); - - // Creates an ArgumentNullException, that will not be handled by any middleware. - var exception = new ArgumentNullException(); - - // The result should true, since the finally function will be executed. - var result = await responsibilityChain.Execute(exception); - - Assert.True(result); - - Assert.Equal(ExceptionSource, exception.Source); - } - - /// - /// Tests the method. - /// - [Fact] - public void Chain_AddTypeThatIsNotAMiddleware_ThrowsException() - { - var responsibilityChain = new AsyncResponsibilityChain(new ActivatorMiddlewareResolver()); - Assert.Throws(() => - { - responsibilityChain.Chain(typeof(ResponsibilityChainTests)); - }); - } - - - /// /// Try to generate a deadlock in synchronous middleware. /// [Fact] public void Execute_SynchronousChainOfResponsibility_SuccessfullyExecute() { - var responsibilityChain = new AsyncResponsibilityChain(new ActivatorMiddlewareResolver()) + var responsibilityChain = new AsyncResponsibilityChain() .Chain() .Chain() .Finally(input => Task.FromResult(input)); diff --git a/src/PipelineNet.Tests/ChainsOfResponsibility/ResponsibilityChainTests.cs b/src/PipelineNet.Tests/ChainsOfResponsibility/ResponsibilityChainTests.cs index 65d0767..ea6f37a 100644 --- a/src/PipelineNet.Tests/ChainsOfResponsibility/ResponsibilityChainTests.cs +++ b/src/PipelineNet.Tests/ChainsOfResponsibility/ResponsibilityChainTests.cs @@ -1,6 +1,5 @@ using PipelineNet.ChainsOfResponsibility; using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; using Xunit; @@ -68,7 +67,7 @@ public bool Run(Exception exception, Func executeNext) [Fact] public void Execute_CreateChainOfMiddlewareToHandleException_TheRightMiddleHandlesTheException() { - var responsibilityChain = new ResponsibilityChain(new ActivatorMiddlewareResolver()) + var responsibilityChain = new ResponsibilityChain() .Chain() .Chain() .Chain(); @@ -88,7 +87,7 @@ public void Execute_CreateChainOfMiddlewareToHandleException_TheRightMiddleHandl [Fact] public void Execute_ChainOfMiddlewareThatDoesNotHandleTheException_ChainReturnsDefaultValue() { - var responsibilityChain = new ResponsibilityChain(new ActivatorMiddlewareResolver()) + var responsibilityChain = new ResponsibilityChain() .Chain() .Chain() .Chain(); @@ -101,44 +100,5 @@ public void Execute_ChainOfMiddlewareThatDoesNotHandleTheException_ChainReturnsD Assert.Equal(default(bool), result); } - - [Fact] - public void Execute_ChainOfMiddlewareWithFinallyFunc_FinallyFuncIsExecuted() - { - const string ExceptionSource = "EXCEPTION_SOURCE"; - - var responsibilityChain = new ResponsibilityChain(new ActivatorMiddlewareResolver()) - .Chain() - .Chain(typeof(InvalidateDataExceptionHandler)) - .Chain() - .Finally((ex) => - { - ex.Source = ExceptionSource; - return true; - }); - - // Creates an ArgumentNullException, that will not be handled by any middleware. - var exception = new ArgumentNullException(); - - // The result should true, since the finally function will be executed. - var result = responsibilityChain.Execute(exception); - - Assert.True(result); - - Assert.Equal(ExceptionSource, exception.Source); - } - - /// - /// Tests the method. - /// - [Fact] - public void Chain_AddTypeThatIsNotAMiddleware_ThrowsException() - { - var responsibilityChain = new ResponsibilityChain(new ActivatorMiddlewareResolver()); - Assert.Throws(() => - { - responsibilityChain.Chain(typeof(ResponsibilityChainTests)); - }); - } } } diff --git a/src/PipelineNet.Tests/PipelineNet.Tests.csproj b/src/PipelineNet.Tests/PipelineNet.Tests.csproj index 1d3682a..e82b34c 100644 --- a/src/PipelineNet.Tests/PipelineNet.Tests.csproj +++ b/src/PipelineNet.Tests/PipelineNet.Tests.csproj @@ -1,20 +1,15 @@ - - + - netcoreapp2.1 - + net5.0 false true - - - - + + + - - + - - + \ No newline at end of file diff --git a/src/PipelineNet.Tests/Pipelines/AsyncPipelineTests.cs b/src/PipelineNet.Tests/Pipelines/AsyncPipelineTests.cs index 804681f..bdff83f 100644 --- a/src/PipelineNet.Tests/Pipelines/AsyncPipelineTests.cs +++ b/src/PipelineNet.Tests/Pipelines/AsyncPipelineTests.cs @@ -1,5 +1,4 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using PipelineNet.Pipelines; using System; using System.Text.RegularExpressions; @@ -76,7 +75,7 @@ public async Task Run(PersonModel context, Func executeNext) [Fact] public async Task Execute_RunSeveralMiddleware_SuccessfullyExecute() { - var pipeline = new AsyncPipeline(new ActivatorMiddlewareResolver()) + var pipeline = new AsyncPipeline() .Add() .Add() .Add() @@ -97,7 +96,7 @@ public async Task Execute_RunSeveralMiddleware_SuccessfullyExecute() [Fact] public async Task Execute_RunSamePipelineTwice_SuccessfullyExecute() { - var pipeline = new AsyncPipeline(new ActivatorMiddlewareResolver()) + var pipeline = new AsyncPipeline() .Add() .Add() .Add() @@ -128,39 +127,5 @@ public async Task Execute_RunSamePipelineTwice_SuccessfullyExecute() // Check if the level of 'personModel' is 4, which is configured by 'PersonWithGenderProperty' middleware. Assert.Equal(4, personModel.Level); } - - [Fact] - public async Task Execute_RunSeveralMiddlewareWithTwoBeingDynamiccalyAdded_SuccessfullyExecute() - { - var pipeline = new AsyncPipeline(new ActivatorMiddlewareResolver()) - .Add() - .Add(typeof(PersonWithOddId)) - .Add() - .Add(typeof(PersonWithGenderProperty)); - - // This person model has a gender, so the last middleware will be the one handling the input. - var personModel = new PersonModel - { - Gender = Gender.Female - }; - - await pipeline.Execute(personModel); - - // Check if the level of 'personModel' is 4, which is configured by 'PersonWithGenderProperty' middleware. - Assert.Equal(4, personModel.Level); - } - - /// - /// Tests the method. - /// - [Fact] - public void Add_AddTypeThatIsNotAMiddleware_ThrowsException() - { - var pipeline = new AsyncPipeline(new ActivatorMiddlewareResolver()); - Assert.Throws(() => - { - pipeline.Add(typeof(AsyncPipelineTests)); - }); - } } } diff --git a/src/PipelineNet.Tests/Pipelines/PipelineTests.cs b/src/PipelineNet.Tests/Pipelines/PipelineTests.cs index bafab6c..acc3d1f 100644 --- a/src/PipelineNet.Tests/Pipelines/PipelineTests.cs +++ b/src/PipelineNet.Tests/Pipelines/PipelineTests.cs @@ -1,7 +1,9 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using PipelineNet.Pipelines; using System; +using System.IO; +using System.Linq; +using System.Text; using System.Text.RegularExpressions; using Xunit; @@ -72,7 +74,7 @@ public void Run(PersonModel context, Action executeNext) [Fact] public void Execute_RunSeveralMiddleware_SuccessfullyExecute() { - var pipeline = new Pipeline(new ActivatorMiddlewareResolver()) + var pipeline = new Pipeline() .Add() .Add() .Add() @@ -93,7 +95,7 @@ public void Execute_RunSeveralMiddleware_SuccessfullyExecute() [Fact] public void Execute_RunSamePipelineTwice_SuccessfullyExecute() { - var pipeline = new Pipeline(new ActivatorMiddlewareResolver()) + var pipeline = new Pipeline() .Add() .Add() .Add() @@ -104,7 +106,6 @@ public void Execute_RunSamePipelineTwice_SuccessfullyExecute() { Name = "this_is_my_email@servername.js" }; - pipeline.Execute(personModel); // Check if the level of 'personModel' is 3, which is configured by 'PersonWithEmailName' middleware. @@ -124,39 +125,5 @@ public void Execute_RunSamePipelineTwice_SuccessfullyExecute() // Check if the level of 'personModel' is 4, which is configured by 'PersonWithGenderProperty' middleware. Assert.Equal(4, personModel.Level); } - - [Fact] - public void Execute_RunSeveralMiddlewareWithTwoBeingDynamiccalyAdded_SuccessfullyExecute() - { - var pipeline = new Pipeline(new ActivatorMiddlewareResolver()) - .Add() - .Add(typeof(PersonWithOddId)) - .Add() - .Add(typeof(PersonWithGenderProperty)); - - // This person model has a gender, so the last middleware will be the one handling the input. - var personModel = new PersonModel - { - Gender = Gender.Female - }; - - pipeline.Execute(personModel); - - // Check if the level of 'personModel' is 4, which is configured by 'PersonWithGenderProperty' middleware. - Assert.Equal(4, personModel.Level); - } - - /// - /// Tests the method. - /// - [Fact] - public void Add_AddTypeThatIsNotAMiddleware_ThrowsException() - { - var pipeline = new Pipeline(new ActivatorMiddlewareResolver()); - Assert.Throws(() => - { - pipeline.Add(typeof(PipelineTests)); - }); - } } } diff --git a/src/PipelineNet.Tests/log.txt b/src/PipelineNet.Tests/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/PipelineNet/BaseMiddlewareFlow.cs b/src/PipelineNet/BaseMiddlewareFlow.cs index 99ccdb6..54705d3 100644 --- a/src/PipelineNet/BaseMiddlewareFlow.cs +++ b/src/PipelineNet/BaseMiddlewareFlow.cs @@ -1,45 +1,11 @@ -using PipelineNet.MiddlewareResolver; -using System; using System.Collections.Generic; -using System.Reflection; +using PipelineNet.Middleware; namespace PipelineNet { public abstract class BaseMiddlewareFlow { - protected IList MiddlewareTypes { get; private set; } - protected IMiddlewareResolver MiddlewareResolver { get; private set; } + public List Middleware{get;protected set;} = new List(); - internal BaseMiddlewareFlow(IMiddlewareResolver middlewareResolver) - { - MiddlewareResolver = middlewareResolver ?? throw new ArgumentNullException("middlewareResolver", - "An instance of IMiddlewareResolver must be provided. You can use ActivatorMiddlewareResolver."); - MiddlewareTypes = new List(); - } - - /// - /// Stores the of the middleware type. - /// - private static readonly TypeInfo MiddlewareTypeInfo = typeof(TMiddleware).GetTypeInfo(); - - /// - /// Adds a new middleware type to the internal list of types. - /// Middleware will be executed in the same order they are added. - /// - /// The middleware type to be executed. - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - protected void AddMiddleware(Type middlewareType) - { - if (middlewareType == null) throw new ArgumentNullException("middlewareType"); - - bool isAssignableFromMiddleware = MiddlewareTypeInfo.IsAssignableFrom(middlewareType.GetTypeInfo()); - if (!isAssignableFromMiddleware) - throw new ArgumentException( - $"The middleware type must implement \"{typeof(TMiddleware)}\"."); - - this.MiddlewareTypes.Add(middlewareType); - } } -} +} \ No newline at end of file diff --git a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs index a6282cf..ecd4536 100644 --- a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs @@ -1,6 +1,6 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace PipelineNet.ChainsOfResponsibility @@ -10,43 +10,21 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class AsyncResponsibilityChain : BaseMiddlewareFlow>, - IAsyncResponsibilityChain + public class AsyncResponsibilityChain : BaseMiddlewareFlow>, IAsyncResponsibilityChain { private Func> _finallyFunc; - /// - /// Creates a new asynchronous chain of responsibility. - /// - /// The resolver used to create the middleware types. - public AsyncResponsibilityChain(IMiddlewareResolver middlewareResolver) : base(middlewareResolver) - { - } - /// /// Chains a new middleware to the chain of responsibility. /// Middleware will be executed in the same order they are added. /// /// The new middleware being added. /// The current instance of . - public IAsyncResponsibilityChain Chain() where TMiddleware : IAsyncMiddleware - { - MiddlewareTypes.Add(typeof(TMiddleware)); - return this; - } - - /// - /// Chains a new middleware type to the chain of responsibility. - /// Middleware will be executed in the same order they are added. - /// - /// The middleware type to be executed. - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - /// The current instance of . - public IAsyncResponsibilityChain Chain(Type middlewareType) + public IAsyncResponsibilityChain Chain(Action configure = null) where TMiddleware : IAsyncMiddleware, new() { - base.AddMiddleware(middlewareType); + var mw = new TMiddleware(); + configure?.Invoke(mw); + Middleware.Add(mw); return this; } @@ -56,27 +34,20 @@ public IAsyncResponsibilityChain Chain(Type middlewareType) /// public async Task Execute(TParameter parameter) { - if (MiddlewareTypes.Count == 0) - return default(TReturn); - - int index = 0; - Func> func = null; - func = (param) => - { - var type = MiddlewareTypes[index]; - var middleware = (IAsyncMiddleware)MiddlewareResolver.Resolve(type); - - index++; - // If the current instance of middleware is the last one in the list, - // the "next" function is assigned to the finally function or a - // default empty function. - if (index == MiddlewareTypes.Count) - func = this._finallyFunc ?? ((p) => Task.FromResult(default(TReturn))); - - return middleware.Run(param, func); - }; + var res = await Do(parameter,Middleware.GetEnumerator()); + return res; - return await func(parameter).ConfigureAwait(false); + async Task Do(TParameter _param,IEnumerator> e){ + + if(!e.MoveNext()){ + if(_finallyFunc is not null) + return await _finallyFunc?.Invoke(_param); + return default(TReturn); + } + return await e.Current.Run(_param,async p=>{ + return await Do(p,e); + }); + } } /// diff --git a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs index 44ec02f..4ee746a 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs @@ -26,19 +26,8 @@ public interface IAsyncResponsibilityChain /// /// The new middleware being added. /// The current instance of . - IAsyncResponsibilityChain Chain() - where TMiddleware : IAsyncMiddleware; - - /// - /// Chains a new middleware type to the chain of responsibility. - /// Middleware will be executed in the same order they are added. - /// - /// The middleware type to be executed. - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - /// The current instance of . - IAsyncResponsibilityChain Chain(Type middlewareType); + IAsyncResponsibilityChain Chain(Action configure = null) + where TMiddleware : IAsyncMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs index 7cf5af2..fdf8e76 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs @@ -25,19 +25,8 @@ public interface IResponsibilityChain /// /// The new middleware being added. /// The current instance of . - IResponsibilityChain Chain() - where TMiddleware : IMiddleware; - - /// - /// Chains a new middleware type to the chain of responsibility. - /// Middleware will be executed in the same order they are added. - /// - /// The middleware type to be executed. - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - /// The current instance of . - IResponsibilityChain Chain(Type middlewareType); + IResponsibilityChain Chain(Action configure = null) + where TMiddleware : IMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs index da238d6..e94b576 100644 --- a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs @@ -1,6 +1,6 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; +using System.Collections.Generic; namespace PipelineNet.ChainsOfResponsibility { @@ -9,19 +9,10 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class ResponsibilityChain : BaseMiddlewareFlow>, - IResponsibilityChain + public class ResponsibilityChain : BaseMiddlewareFlow>, IResponsibilityChain { private Func _finallyFunc; - /// - /// Creates a new chain of responsibility. - /// - /// - public ResponsibilityChain(IMiddlewareResolver middlewareResolver) : base(middlewareResolver) - { - } - /// /// Sets the function to be executed at the end of the chain as a fallback. /// A chain can only have one finally function. Calling this method more @@ -41,27 +32,15 @@ public IResponsibilityChain Finally(Func /// The new middleware being added. /// The current instance of . - public IResponsibilityChain Chain() - where TMiddleware : IMiddleware + public IResponsibilityChain Chain(Action configure = null) + where TMiddleware : IMiddleware, new() { - MiddlewareTypes.Add(typeof(TMiddleware)); + var mw = new TMiddleware(); + configure?.Invoke(mw); + Middleware.Add(mw); return this; } - /// - /// Chains a new middleware type to the chain of responsibility. - /// Middleware will be executed in the same order they are added. - /// - /// The middleware type to be executed. - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - /// The current instance of . - public IResponsibilityChain Chain(Type middlewareType) - { - base.AddMiddleware(middlewareType); - return this; - } /// /// Execute the configured chain of responsibility. @@ -69,27 +48,20 @@ public IResponsibilityChain Chain(Type middlewareType) /// public TReturn Execute(TParameter parameter) { - if (MiddlewareTypes.Count == 0) - return default(TReturn); - - int index = 0; - Func func = null; - func = (param) => - { - var type = MiddlewareTypes[index]; - var middleware = (IMiddleware)MiddlewareResolver.Resolve(type); - - index++; - // If the current instance of middleware is the last one in the list, - // the "next" function is assigned to the finally function or a - // default empty function. - if (index == MiddlewareTypes.Count) - func = this._finallyFunc ?? ((p) => default(TReturn)); - - return middleware.Run(param, func); - }; + var res = Do(parameter,Middleware.GetEnumerator()); + return res; - return func(parameter); + TReturn Do(TParameter _param,IEnumerator> e){ + if(!e.MoveNext()){ + if(_finallyFunc is not null) + return _finallyFunc.Invoke(_param); + return default(TReturn); + } + + return e.Current.Run(_param,p=>{ + return Do(p,e); + }); + } } } } diff --git a/src/PipelineNet/Middleware/IAsyncMiddleware.WithReturn.cs b/src/PipelineNet/Middleware/IAsyncMiddleware.WithReturn.cs index fb7ccf5..3fe275f 100644 --- a/src/PipelineNet/Middleware/IAsyncMiddleware.WithReturn.cs +++ b/src/PipelineNet/Middleware/IAsyncMiddleware.WithReturn.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; namespace PipelineNet.Middleware @@ -7,4 +7,4 @@ public interface IAsyncMiddleware { Task Run(TParameter parameter, Func> next); } -} +} \ No newline at end of file diff --git a/src/PipelineNet/Middleware/IMiddleware.WithReturn.cs b/src/PipelineNet/Middleware/IMiddleware.WithResult.cs similarity index 90% rename from src/PipelineNet/Middleware/IMiddleware.WithReturn.cs rename to src/PipelineNet/Middleware/IMiddleware.WithResult.cs index b063101..5ff443e 100644 --- a/src/PipelineNet/Middleware/IMiddleware.WithReturn.cs +++ b/src/PipelineNet/Middleware/IMiddleware.WithResult.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace PipelineNet.Middleware { @@ -6,4 +6,4 @@ public interface IMiddleware { TReturn Run(TParameter parameter, Func next); } -} +} \ No newline at end of file diff --git a/src/PipelineNet/MiddlewareResolver/ActivatorMiddlewareResolver.cs b/src/PipelineNet/MiddlewareResolver/ActivatorMiddlewareResolver.cs deleted file mode 100644 index a96c918..0000000 --- a/src/PipelineNet/MiddlewareResolver/ActivatorMiddlewareResolver.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace PipelineNet.MiddlewareResolver -{ - /// - /// A default implementation of that creates - /// instances using the . - /// - public class ActivatorMiddlewareResolver : IMiddlewareResolver - { - public object Resolve(Type type) - { - return Activator.CreateInstance(type); - } - } -} diff --git a/src/PipelineNet/MiddlewareResolver/IMiddlewareResolver.cs b/src/PipelineNet/MiddlewareResolver/IMiddlewareResolver.cs deleted file mode 100644 index 36f4670..0000000 --- a/src/PipelineNet/MiddlewareResolver/IMiddlewareResolver.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace PipelineNet.MiddlewareResolver -{ - /// - /// Used to create instances of middleware. - /// You can implement this interface for your preferred dependency injection container. - /// - public interface IMiddlewareResolver - { - /// - /// Creates an instance of the give middleware type. - /// - /// The middleware type that will be created. - /// An instance of the middleware. - object Resolve(Type type); - } -} diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index c77e500..907faaf 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -1,7 +1,7 @@  - netstandard1.1 + net5.0 diff --git a/src/PipelineNet/Pipelines/AsyncPipeline.cs b/src/PipelineNet/Pipelines/AsyncPipeline.cs index 0a2b4d8..776ae89 100644 --- a/src/PipelineNet/Pipelines/AsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/AsyncPipeline.cs @@ -1,6 +1,6 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace PipelineNet.Pipelines @@ -8,34 +8,21 @@ namespace PipelineNet.Pipelines public class AsyncPipeline : BaseMiddlewareFlow>, IAsyncPipeline where TParameter : class { - public AsyncPipeline(IMiddlewareResolver middlewareResolver) : base(middlewareResolver) - {} /// /// Adds a middleware type to be executed. /// /// /// - public IAsyncPipeline Add() - where TMiddleware : IAsyncMiddleware + public IAsyncPipeline Add(Action configure = null) + where TMiddleware : IAsyncMiddleware, new() { - MiddlewareTypes.Add(typeof(TMiddleware)); + var middleware = new TMiddleware(); + configure?.Invoke(middleware); + Middleware.Add(middleware); return this; } - /// - /// Adds a middleware type to be executed. - /// - /// The middleware type to be executed. - /// - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - public IAsyncPipeline Add(Type middlewareType) - { - base.AddMiddleware(middlewareType); - return this; - } /// /// Execute the configured pipeline. @@ -43,24 +30,14 @@ public IAsyncPipeline Add(Type middlewareType) /// public async Task Execute(TParameter parameter) { - if (MiddlewareTypes.Count == 0) - return; - - int index = 0; - Func action = null; - action = async (param) => - { - var type = MiddlewareTypes[index]; - var firstMiddleware = (IAsyncMiddleware)MiddlewareResolver.Resolve(type); - - index++; - if (index == MiddlewareTypes.Count) - action = (p) => Task.FromResult(0); - - await firstMiddleware.Run(param, action).ConfigureAwait(false); - }; - - await action(parameter).ConfigureAwait(false); + await Do(parameter,Middleware.GetEnumerator()); + + async Task Do(TParameter _param,IEnumerator> e){ + if(!e.MoveNext()) return; + await e.Current.Run(_param,async p=>{ + await Do(p,e); + }); + } } } } diff --git a/src/PipelineNet/Pipelines/IAsyncPipeline.cs b/src/PipelineNet/Pipelines/IAsyncPipeline.cs index c4a5a37..5663a87 100644 --- a/src/PipelineNet/Pipelines/IAsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/IAsyncPipeline.cs @@ -11,8 +11,8 @@ public interface IAsyncPipeline /// /// /// - IAsyncPipeline Add() - where TMiddleware : IAsyncMiddleware; + IAsyncPipeline Add(Action configure = null) + where TMiddleware : IAsyncMiddleware, new(); /// /// Execute the configured pipeline. @@ -20,14 +20,5 @@ IAsyncPipeline Add() /// Task Execute(TParameter parameter); - /// - /// Adds a middleware type to be executed. - /// - /// The middleware type to be executed. - /// - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - IAsyncPipeline Add(Type middlewareType); } } diff --git a/src/PipelineNet/Pipelines/IPipeline.cs b/src/PipelineNet/Pipelines/IPipeline.cs index 5e38e31..85fadc9 100644 --- a/src/PipelineNet/Pipelines/IPipeline.cs +++ b/src/PipelineNet/Pipelines/IPipeline.cs @@ -15,8 +15,8 @@ public interface IPipeline /// /// /// - IPipeline Add() - where TMiddleware : IMiddleware; + IPipeline Add(Action configure = null) + where TMiddleware : IMiddleware, new(); /// /// Executes the configured pipeline. @@ -24,14 +24,5 @@ IPipeline Add() /// The input that will be provided to all middleware. void Execute(TParameter parameter); - /// - /// Adds a middleware type to be executed. - /// - /// The middleware type to be executed. - /// - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - IPipeline Add(Type middlewareType); } } diff --git a/src/PipelineNet/Pipelines/Pipeline.cs b/src/PipelineNet/Pipelines/Pipeline.cs index 4153298..2bc0d63 100644 --- a/src/PipelineNet/Pipelines/Pipeline.cs +++ b/src/PipelineNet/Pipelines/Pipeline.cs @@ -1,6 +1,10 @@ using PipelineNet.Middleware; -using PipelineNet.MiddlewareResolver; using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace PipelineNet.Pipelines { @@ -11,36 +15,27 @@ namespace PipelineNet.Pipelines /// The type that will be the input for all the middleware. public class Pipeline : BaseMiddlewareFlow>, IPipeline { - /// - /// Creates a new instance of Pipeline. - /// - /// Resolver responsible for resolving instances out of middleware types. - public Pipeline(IMiddlewareResolver middlewareResolver) : base(middlewareResolver) - {} - /// - /// Adds a middleware type to be executed. - /// - /// - /// - public IPipeline Add() - where TMiddleware : IMiddleware + public Pipeline() { - MiddlewareTypes.Add(typeof(TMiddleware)); - return this; - } - /// + } + /// /// Adds a middleware type to be executed. /// - /// The middleware type to be executed. + /// /// - /// Thrown if the is - /// not an implementation of . - /// Thrown if is null. - public IPipeline Add(Type middlewareType) + public IPipeline Add(Action configure = null) + where TMiddleware : IMiddleware,new() { - base.AddMiddleware(middlewareType); + + var middleware = new TMiddleware(); + if (middleware==null){ + + } + configure?.Invoke(middleware); + Middleware.Add(middleware); + return this; } @@ -50,24 +45,16 @@ public IPipeline Add(Type middlewareType) /// The input that will be provided to all middleware. public void Execute(TParameter parameter) { - if (MiddlewareTypes.Count == 0) - return; - - int index = 0; - Action action = null; - action = (param) => - { - var type = MiddlewareTypes[index]; - var middleware = (IMiddleware)MiddlewareResolver.Resolve(type); - - index++; - if (index == MiddlewareTypes.Count) - action = (p) => { }; - - middleware.Run(param, action); - }; - action(parameter); + Do(parameter,Middleware.GetEnumerator()); + return; + + void Do(TParameter _param,IEnumerator> e){ + if(!e.MoveNext()) return; + e.Current.Run(_param,p=>{ + Do(p,e); + }); + } } } } \ No newline at end of file From 82d5f5febdd4b1f13daac40b2ccc37bed412c5c1 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 13 Oct 2021 17:13:03 +0500 Subject: [PATCH 02/14] changed project target version --- .../AsyncResponsibilityChain.cs | 29 +++++++++++++------ .../IAsyncResponsibilityChain.cs | 3 ++ .../IResponsibilityChain.cs | 3 ++ .../ResponsibilityChain.cs | 29 +++++++++++++------ src/PipelineNet/PipelineNet.csproj | 22 +++++++------- src/PipelineNet/Pipelines/AsyncPipeline.cs | 7 +++++ src/PipelineNet/Pipelines/IAsyncPipeline.cs | 4 ++- src/PipelineNet/Pipelines/IPipeline.cs | 4 ++- src/PipelineNet/Pipelines/Pipeline.cs | 7 +++++ 9 files changed, 76 insertions(+), 32 deletions(-) diff --git a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs index ecd4536..0461ab2 100644 --- a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs @@ -1,6 +1,7 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.ChainsOfResponsibility @@ -10,7 +11,7 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class AsyncResponsibilityChain : BaseMiddlewareFlow>, IAsyncResponsibilityChain + public class AsyncResponsibilityChain : BaseMiddlewareFlow>, IAsyncResponsibilityChain { private Func> _finallyFunc; @@ -28,24 +29,34 @@ public class AsyncResponsibilityChain : BaseMiddlewareFlow< return this; } + public IAsyncResponsibilityChain Chain([NotNull] TMiddleware middleware) where TMiddleware : IAsyncMiddleware, new() + { + Middleware.Add(middleware); + return this; + } + /// /// Executes the configured chain of responsibility. /// /// public async Task Execute(TParameter parameter) { - var res = await Do(parameter,Middleware.GetEnumerator()); + var res = await Do(parameter, Middleware.GetEnumerator()); return res; - async Task Do(TParameter _param,IEnumerator> e){ - - if(!e.MoveNext()){ - if(_finallyFunc is not null) + async Task Do(TParameter _param, IEnumerator> e) + { + + if (!e.MoveNext()) + { + if (_finallyFunc is null) + return default(TReturn); + else return await _finallyFunc?.Invoke(_param); - return default(TReturn); } - return await e.Current.Run(_param,async p=>{ - return await Do(p,e); + return await e.Current.Run(_param, async p => + { + return await Do(p, e); }); } } diff --git a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs index 4ee746a..b6468d6 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs @@ -1,5 +1,6 @@ using PipelineNet.Middleware; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.ChainsOfResponsibility @@ -28,6 +29,8 @@ public interface IAsyncResponsibilityChain /// The current instance of . IAsyncResponsibilityChain Chain(Action configure = null) where TMiddleware : IAsyncMiddleware, new(); + IAsyncResponsibilityChain Chain([NotNull]TMiddleware middleware) + where TMiddleware : IAsyncMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs index fdf8e76..d9fead7 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs @@ -1,5 +1,6 @@ using PipelineNet.Middleware; using System; +using System.Diagnostics.CodeAnalysis; namespace PipelineNet.ChainsOfResponsibility { @@ -27,6 +28,8 @@ public interface IResponsibilityChain /// The current instance of . IResponsibilityChain Chain(Action configure = null) where TMiddleware : IMiddleware, new(); + IResponsibilityChain Chain([NotNull] TMiddleware middleware) + where TMiddleware : IMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs index e94b576..995dde3 100644 --- a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs @@ -1,6 +1,7 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace PipelineNet.ChainsOfResponsibility { @@ -9,7 +10,7 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class ResponsibilityChain : BaseMiddlewareFlow>, IResponsibilityChain + public class ResponsibilityChain : BaseMiddlewareFlow>, IResponsibilityChain { private Func _finallyFunc; @@ -41,6 +42,11 @@ public IResponsibilityChain Chain(Action Chain([NotNull] TMiddleware middleware) where TMiddleware : IMiddleware, new() + { + Middleware.Add(middleware); + return this; + } /// /// Execute the configured chain of responsibility. @@ -48,20 +54,25 @@ public IResponsibilityChain Chain(Action public TReturn Execute(TParameter parameter) { - var res = Do(parameter,Middleware.GetEnumerator()); + var res = Do(parameter, Middleware.GetEnumerator()); return res; - TReturn Do(TParameter _param,IEnumerator> e){ - if(!e.MoveNext()){ - if(_finallyFunc is not null) + TReturn Do(TParameter _param, IEnumerator> e) + { + if (!e.MoveNext()) + { + if (_finallyFunc is null) + return default(TReturn); + else return _finallyFunc.Invoke(_param); - return default(TReturn); } - - return e.Current.Run(_param,p=>{ - return Do(p,e); + + return e.Current.Run(_param, p => + { + return Do(p, e); }); } } + } } diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index 907faaf..6c6f6fd 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -1,31 +1,29 @@ - - + - net5.0 + netstandard2.0 - 1.0.0 PipelineNet - PipelineNet + Kemsekov.PipelineNet $(Version) - Israel Valverde + Israel Valverde and Kemsekov A micro framework that helps you implement pipeline and chain of responsibility patterns. - https://github.com/ipvalverde/PipelineNet - https://github.com/ipvalverde/PipelineNet/blob/master/LICENSE + https://github.com/Kemsekov/PipelineNet + https://github.com/Kemsekov/PipelineNet/blob/master/LICENSE Copyright © Israel Valverde Pipeline .NetCore Portable Chain Responsibility ChainOfResponsibility Core NetStandard - $(PackageReleaseNotes) - - Updating csproj file format; - Adding support for blocking calls in asp.net and UI threads; - - + + + + \ No newline at end of file diff --git a/src/PipelineNet/Pipelines/AsyncPipeline.cs b/src/PipelineNet/Pipelines/AsyncPipeline.cs index 776ae89..3aac822 100644 --- a/src/PipelineNet/Pipelines/AsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/AsyncPipeline.cs @@ -1,6 +1,7 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.Pipelines @@ -23,6 +24,12 @@ public IAsyncPipeline Add(Action configure return this; } + public IAsyncPipeline Add([NotNull] TMiddleware middleware) where TMiddleware : IAsyncMiddleware, new() + { + Middleware.Add(middleware); + return this; + } + /// /// Execute the configured pipeline. diff --git a/src/PipelineNet/Pipelines/IAsyncPipeline.cs b/src/PipelineNet/Pipelines/IAsyncPipeline.cs index 5663a87..6c9c1ef 100644 --- a/src/PipelineNet/Pipelines/IAsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/IAsyncPipeline.cs @@ -1,5 +1,6 @@ using PipelineNet.Middleware; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.Pipelines @@ -13,7 +14,8 @@ public interface IAsyncPipeline /// IAsyncPipeline Add(Action configure = null) where TMiddleware : IAsyncMiddleware, new(); - + IAsyncPipeline Add([NotNull]TMiddleware middleware) + where TMiddleware : IAsyncMiddleware, new(); /// /// Execute the configured pipeline. /// diff --git a/src/PipelineNet/Pipelines/IPipeline.cs b/src/PipelineNet/Pipelines/IPipeline.cs index 85fadc9..b6cbc48 100644 --- a/src/PipelineNet/Pipelines/IPipeline.cs +++ b/src/PipelineNet/Pipelines/IPipeline.cs @@ -1,5 +1,6 @@ using PipelineNet.Middleware; using System; +using System.Diagnostics.CodeAnalysis; namespace PipelineNet.Pipelines { @@ -17,7 +18,8 @@ public interface IPipeline /// IPipeline Add(Action configure = null) where TMiddleware : IMiddleware, new(); - + IPipeline Add([NotNull]TMiddleware middleware) + where TMiddleware : IMiddleware, new(); /// /// Executes the configured pipeline. /// diff --git a/src/PipelineNet/Pipelines/Pipeline.cs b/src/PipelineNet/Pipelines/Pipeline.cs index 2bc0d63..66450bf 100644 --- a/src/PipelineNet/Pipelines/Pipeline.cs +++ b/src/PipelineNet/Pipelines/Pipeline.cs @@ -1,6 +1,7 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; @@ -39,6 +40,12 @@ public IPipeline Add(Action configure = nu return this; } + public IPipeline Add([NotNull] TMiddleware middleware) where TMiddleware : IMiddleware, new() + { + Middleware.Add(middleware); + return this; + } + /// /// Executes the configured pipeline. /// From c6f4ff59c02505966cb58419a8c3e7c0597906eb Mon Sep 17 00:00:00 2001 From: Vlad Kemsekov <57869319+Kemsekov@users.noreply.github.com> Date: Wed, 13 Oct 2021 17:14:10 +0500 Subject: [PATCH 03/14] Delete launch.json --- src/PipelineNet.Tests/.vscode/launch.json | 26 ----------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/PipelineNet.Tests/.vscode/launch.json diff --git a/src/PipelineNet.Tests/.vscode/launch.json b/src/PipelineNet.Tests/.vscode/launch.json deleted file mode 100644 index fd139b9..0000000 --- a/src/PipelineNet.Tests/.vscode/launch.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - // Use IntelliSense to find out which attributes exist for C# debugging - // Use hover for the description of the existing attributes - // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/bin/Debug/netcoreapp2.1/PipelineNet.Tests.dll", - "args": [], - "cwd": "${workspaceFolder}", - // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console - "console": "internalConsole", - "stopAtEntry": false - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach" - } - ] -} \ No newline at end of file From e6fced7f40a3f816a1b16a941811fef63c6debe5 Mon Sep 17 00:00:00 2001 From: Vlad Kemsekov <57869319+Kemsekov@users.noreply.github.com> Date: Wed, 13 Oct 2021 17:14:16 +0500 Subject: [PATCH 04/14] Delete tasks.json --- src/PipelineNet.Tests/.vscode/tasks.json | 42 ------------------------ 1 file changed, 42 deletions(-) delete mode 100644 src/PipelineNet.Tests/.vscode/tasks.json diff --git a/src/PipelineNet.Tests/.vscode/tasks.json b/src/PipelineNet.Tests/.vscode/tasks.json deleted file mode 100644 index 1143064..0000000 --- a/src/PipelineNet.Tests/.vscode/tasks.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "command": "dotnet", - "type": "process", - "args": [ - "build", - "${workspaceFolder}/PipelineNet.Tests.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "publish", - "command": "dotnet", - "type": "process", - "args": [ - "publish", - "${workspaceFolder}/PipelineNet.Tests.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "watch", - "command": "dotnet", - "type": "process", - "args": [ - "watch", - "run", - "${workspaceFolder}/PipelineNet.Tests.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file From 4cb3c080f78e611191c232f0adefd0a74e6ca5f2 Mon Sep 17 00:00:00 2001 From: Vlad Kemsekov <57869319+Kemsekov@users.noreply.github.com> Date: Wed, 13 Oct 2021 17:14:39 +0500 Subject: [PATCH 05/14] Delete log.txt --- src/PipelineNet.Tests/log.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/PipelineNet.Tests/log.txt diff --git a/src/PipelineNet.Tests/log.txt b/src/PipelineNet.Tests/log.txt deleted file mode 100644 index e69de29..0000000 From cf0759dbd5468a4fe3dbd11ce231337fbc7e895d Mon Sep 17 00:00:00 2001 From: Vlad Kemsekov <57869319+Kemsekov@users.noreply.github.com> Date: Wed, 13 Oct 2021 17:15:47 +0500 Subject: [PATCH 06/14] Update .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 776cf7c..98b2ca4 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,10 @@ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ +**/obj/ +**/bin/ +# Vs code settings +**/.vscode/ # Visual Studio 2015 cache/options directory .vs/ From 48e4497f3adefb94e34ae88a2a789994c6e1207f Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 12 Aug 2023 22:39:38 +0500 Subject: [PATCH 07/14] fixing unattached commit --- src/PipelineNet.Tests/log.txt | 0 .../AsyncResponsibilityChain.cs | 29 ++++++------------- .../IAsyncResponsibilityChain.cs | 3 -- .../IResponsibilityChain.cs | 3 -- .../ResponsibilityChain.cs | 29 ++++++------------- src/PipelineNet/PipelineNet.csproj | 22 +++++++------- src/PipelineNet/PipelineNet.sln | 25 ++++++++++++++++ src/PipelineNet/Pipelines/AsyncPipeline.cs | 7 ----- src/PipelineNet/Pipelines/IAsyncPipeline.cs | 4 +-- src/PipelineNet/Pipelines/IPipeline.cs | 4 +-- src/PipelineNet/Pipelines/Pipeline.cs | 7 ----- 11 files changed, 57 insertions(+), 76 deletions(-) create mode 100644 src/PipelineNet.Tests/log.txt create mode 100644 src/PipelineNet/PipelineNet.sln diff --git a/src/PipelineNet.Tests/log.txt b/src/PipelineNet.Tests/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs index 0461ab2..ecd4536 100644 --- a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs @@ -1,7 +1,6 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.ChainsOfResponsibility @@ -11,7 +10,7 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class AsyncResponsibilityChain : BaseMiddlewareFlow>, IAsyncResponsibilityChain + public class AsyncResponsibilityChain : BaseMiddlewareFlow>, IAsyncResponsibilityChain { private Func> _finallyFunc; @@ -29,34 +28,24 @@ public class AsyncResponsibilityChain : BaseMiddlewareFlow< return this; } - public IAsyncResponsibilityChain Chain([NotNull] TMiddleware middleware) where TMiddleware : IAsyncMiddleware, new() - { - Middleware.Add(middleware); - return this; - } - /// /// Executes the configured chain of responsibility. /// /// public async Task Execute(TParameter parameter) { - var res = await Do(parameter, Middleware.GetEnumerator()); + var res = await Do(parameter,Middleware.GetEnumerator()); return res; - async Task Do(TParameter _param, IEnumerator> e) - { - - if (!e.MoveNext()) - { - if (_finallyFunc is null) - return default(TReturn); - else + async Task Do(TParameter _param,IEnumerator> e){ + + if(!e.MoveNext()){ + if(_finallyFunc is not null) return await _finallyFunc?.Invoke(_param); + return default(TReturn); } - return await e.Current.Run(_param, async p => - { - return await Do(p, e); + return await e.Current.Run(_param,async p=>{ + return await Do(p,e); }); } } diff --git a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs index b6468d6..4ee746a 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IAsyncResponsibilityChain.cs @@ -1,6 +1,5 @@ using PipelineNet.Middleware; using System; -using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.ChainsOfResponsibility @@ -29,8 +28,6 @@ public interface IAsyncResponsibilityChain /// The current instance of . IAsyncResponsibilityChain Chain(Action configure = null) where TMiddleware : IAsyncMiddleware, new(); - IAsyncResponsibilityChain Chain([NotNull]TMiddleware middleware) - where TMiddleware : IAsyncMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs index d9fead7..fdf8e76 100644 --- a/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/IResponsibilityChain.cs @@ -1,6 +1,5 @@ using PipelineNet.Middleware; using System; -using System.Diagnostics.CodeAnalysis; namespace PipelineNet.ChainsOfResponsibility { @@ -28,8 +27,6 @@ public interface IResponsibilityChain /// The current instance of . IResponsibilityChain Chain(Action configure = null) where TMiddleware : IMiddleware, new(); - IResponsibilityChain Chain([NotNull] TMiddleware middleware) - where TMiddleware : IMiddleware, new(); /// /// Executes the configured chain of responsibility. diff --git a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs index 995dde3..e94b576 100644 --- a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs @@ -1,7 +1,6 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; namespace PipelineNet.ChainsOfResponsibility { @@ -10,7 +9,7 @@ namespace PipelineNet.ChainsOfResponsibility /// /// The input type for the chain. /// The return type of the chain. - public class ResponsibilityChain : BaseMiddlewareFlow>, IResponsibilityChain + public class ResponsibilityChain : BaseMiddlewareFlow>, IResponsibilityChain { private Func _finallyFunc; @@ -42,11 +41,6 @@ public IResponsibilityChain Chain(Action Chain([NotNull] TMiddleware middleware) where TMiddleware : IMiddleware, new() - { - Middleware.Add(middleware); - return this; - } /// /// Execute the configured chain of responsibility. @@ -54,25 +48,20 @@ public IResponsibilityChain Chain(Action public TReturn Execute(TParameter parameter) { - var res = Do(parameter, Middleware.GetEnumerator()); + var res = Do(parameter,Middleware.GetEnumerator()); return res; - TReturn Do(TParameter _param, IEnumerator> e) - { - if (!e.MoveNext()) - { - if (_finallyFunc is null) - return default(TReturn); - else + TReturn Do(TParameter _param,IEnumerator> e){ + if(!e.MoveNext()){ + if(_finallyFunc is not null) return _finallyFunc.Invoke(_param); + return default(TReturn); } - - return e.Current.Run(_param, p => - { - return Do(p, e); + + return e.Current.Run(_param,p=>{ + return Do(p,e); }); } } - } } diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index 6c6f6fd..907faaf 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -1,29 +1,31 @@ - + + - netstandard2.0 + net5.0 + 1.0.0 PipelineNet - Kemsekov.PipelineNet + PipelineNet $(Version) - Israel Valverde and Kemsekov + Israel Valverde A micro framework that helps you implement pipeline and chain of responsibility patterns. - https://github.com/Kemsekov/PipelineNet - https://github.com/Kemsekov/PipelineNet/blob/master/LICENSE + https://github.com/ipvalverde/PipelineNet + https://github.com/ipvalverde/PipelineNet/blob/master/LICENSE Copyright © Israel Valverde Pipeline .NetCore Portable Chain Responsibility ChainOfResponsibility Core NetStandard + $(PackageReleaseNotes) + - Updating csproj file format; - Adding support for blocking calls in asp.net and UI threads; - - - - \ No newline at end of file + + diff --git a/src/PipelineNet/PipelineNet.sln b/src/PipelineNet/PipelineNet.sln new file mode 100644 index 0000000..c9e5abe --- /dev/null +++ b/src/PipelineNet/PipelineNet.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PipelineNet", "PipelineNet.csproj", "{30224EA6-068B-4129-907A-28B577043D07}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30224EA6-068B-4129-907A-28B577043D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30224EA6-068B-4129-907A-28B577043D07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30224EA6-068B-4129-907A-28B577043D07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30224EA6-068B-4129-907A-28B577043D07}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4F010188-9D17-4ADF-BD8C-D35C6F0F03B3} + EndGlobalSection +EndGlobal diff --git a/src/PipelineNet/Pipelines/AsyncPipeline.cs b/src/PipelineNet/Pipelines/AsyncPipeline.cs index 3aac822..776ae89 100644 --- a/src/PipelineNet/Pipelines/AsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/AsyncPipeline.cs @@ -1,7 +1,6 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.Pipelines @@ -24,12 +23,6 @@ public IAsyncPipeline Add(Action configure return this; } - public IAsyncPipeline Add([NotNull] TMiddleware middleware) where TMiddleware : IAsyncMiddleware, new() - { - Middleware.Add(middleware); - return this; - } - /// /// Execute the configured pipeline. diff --git a/src/PipelineNet/Pipelines/IAsyncPipeline.cs b/src/PipelineNet/Pipelines/IAsyncPipeline.cs index 6c9c1ef..5663a87 100644 --- a/src/PipelineNet/Pipelines/IAsyncPipeline.cs +++ b/src/PipelineNet/Pipelines/IAsyncPipeline.cs @@ -1,6 +1,5 @@ using PipelineNet.Middleware; using System; -using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace PipelineNet.Pipelines @@ -14,8 +13,7 @@ public interface IAsyncPipeline /// IAsyncPipeline Add(Action configure = null) where TMiddleware : IAsyncMiddleware, new(); - IAsyncPipeline Add([NotNull]TMiddleware middleware) - where TMiddleware : IAsyncMiddleware, new(); + /// /// Execute the configured pipeline. /// diff --git a/src/PipelineNet/Pipelines/IPipeline.cs b/src/PipelineNet/Pipelines/IPipeline.cs index b6cbc48..85fadc9 100644 --- a/src/PipelineNet/Pipelines/IPipeline.cs +++ b/src/PipelineNet/Pipelines/IPipeline.cs @@ -1,6 +1,5 @@ using PipelineNet.Middleware; using System; -using System.Diagnostics.CodeAnalysis; namespace PipelineNet.Pipelines { @@ -18,8 +17,7 @@ public interface IPipeline /// IPipeline Add(Action configure = null) where TMiddleware : IMiddleware, new(); - IPipeline Add([NotNull]TMiddleware middleware) - where TMiddleware : IMiddleware, new(); + /// /// Executes the configured pipeline. /// diff --git a/src/PipelineNet/Pipelines/Pipeline.cs b/src/PipelineNet/Pipelines/Pipeline.cs index 66450bf..2bc0d63 100644 --- a/src/PipelineNet/Pipelines/Pipeline.cs +++ b/src/PipelineNet/Pipelines/Pipeline.cs @@ -1,7 +1,6 @@ using PipelineNet.Middleware; using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; @@ -40,12 +39,6 @@ public IPipeline Add(Action configure = nu return this; } - public IPipeline Add([NotNull] TMiddleware middleware) where TMiddleware : IMiddleware, new() - { - Middleware.Add(middleware); - return this; - } - /// /// Executes the configured pipeline. /// From 99013f084839527e6f8801a336b47cf7e3126988 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 14 Aug 2023 22:30:08 +0500 Subject: [PATCH 08/14] added methods chain pattern --- .../MethodsChains/MethodsChain.cs | 31 +++++++++++++++++++ .../PipelineNet.Tests.csproj | 2 +- src/PipelineNet.Tests/log.txt | 0 .../MethodsChains/IMethodsChain.cs | 25 +++++++++++++++ src/PipelineNet/MethodsChains/MethodsChain.cs | 31 +++++++++++++++++++ src/PipelineNet/PipelineNet.sln | 25 --------------- src/PipelineNet/Pipelines/IPipeline.cs | 1 + 7 files changed, 89 insertions(+), 26 deletions(-) create mode 100644 src/PipelineNet.Tests/MethodsChains/MethodsChain.cs delete mode 100644 src/PipelineNet.Tests/log.txt create mode 100644 src/PipelineNet/MethodsChains/IMethodsChain.cs create mode 100644 src/PipelineNet/MethodsChains/MethodsChain.cs delete mode 100644 src/PipelineNet/PipelineNet.sln diff --git a/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs b/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs new file mode 100644 index 0000000..37b11d9 --- /dev/null +++ b/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs @@ -0,0 +1,31 @@ +using System; +using PipelineNet.MethodsChains; +using Xunit; + +namespace PipelineNet.Tests.MethodsChains{ + public class MethodsChainsTests{ + [Fact] + public void NumberTransform(){ + var chain = MethodsChain + .Chain(num=>(1+num).ToString()) + .Chain(numStr=>numStr+"2") + .Chain(int.Parse); + var expected = 12352; + var actual = chain.Run(1234); + Assert.Equal(expected,actual); + } + [Fact] + public void MethodAbortion(){ + bool reachedEnd = false; + var chain = MethodsChain + .Chain(num=>num+1) + .Chain(num=>num % 3 == 0 ? num/3 - 1 : throw new Exception()) + .Chain(num=>{ + reachedEnd = true; + return num+1 % 2 == 0 ? "yes" : "no"; + }); + Assert.Throws(()=>chain.Run(25)); + Assert.False(reachedEnd); + } + } +} \ No newline at end of file diff --git a/src/PipelineNet.Tests/PipelineNet.Tests.csproj b/src/PipelineNet.Tests/PipelineNet.Tests.csproj index e82b34c..68eff19 100644 --- a/src/PipelineNet.Tests/PipelineNet.Tests.csproj +++ b/src/PipelineNet.Tests/PipelineNet.Tests.csproj @@ -1,6 +1,6 @@ - net5.0 + net7.0 false true diff --git a/src/PipelineNet.Tests/log.txt b/src/PipelineNet.Tests/log.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/PipelineNet/MethodsChains/IMethodsChain.cs b/src/PipelineNet/MethodsChains/IMethodsChain.cs new file mode 100644 index 0000000..33610f9 --- /dev/null +++ b/src/PipelineNet/MethodsChains/IMethodsChain.cs @@ -0,0 +1,25 @@ +using System; + +namespace PipelineNet.MethodsChains +{ + /// + /// Pipeline-like chain of functions, thats allows continuous data transformation and + /// support execution abortion + /// + public interface IMethodsChain + { + /// + /// Used to get output from input.
+ /// Throw any exception in this method -> it will stop pipeline execution + ///
+ Func OnCall { get; } + /// + /// Chains current chain output to next chain input. In the end works like function decorator. + /// + IMethodsChain Chain(Func onCall); + /// + /// Use to get output from input.
+ ///
+ TOutput Run(TInput input); + } +} diff --git a/src/PipelineNet/MethodsChains/MethodsChain.cs b/src/PipelineNet/MethodsChains/MethodsChain.cs new file mode 100644 index 0000000..7093608 --- /dev/null +++ b/src/PipelineNet/MethodsChains/MethodsChain.cs @@ -0,0 +1,31 @@ +using System; + +namespace PipelineNet.MethodsChains +{ + /// + /// Methods chain implementation + /// + public class MethodsChain : IMethodsChain + { + public Func OnCall { get; set; } + + public MethodsChain(Func onCall) + { + OnCall = onCall; + } + public static IMethodsChain Chain(Func onCall) => new MethodsChain(onCall); + public IMethodsChain Chain(Func nextCall) + { + return new MethodsChain( + input => + { + TOutput output; + output = Run(input); + return nextCall(output); + } + ); + } + + public TOutput Run(TInput input)=>OnCall(input); + } +} diff --git a/src/PipelineNet/PipelineNet.sln b/src/PipelineNet/PipelineNet.sln deleted file mode 100644 index c9e5abe..0000000 --- a/src/PipelineNet/PipelineNet.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.002.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PipelineNet", "PipelineNet.csproj", "{30224EA6-068B-4129-907A-28B577043D07}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {30224EA6-068B-4129-907A-28B577043D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30224EA6-068B-4129-907A-28B577043D07}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30224EA6-068B-4129-907A-28B577043D07}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30224EA6-068B-4129-907A-28B577043D07}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {4F010188-9D17-4ADF-BD8C-D35C6F0F03B3} - EndGlobalSection -EndGlobal diff --git a/src/PipelineNet/Pipelines/IPipeline.cs b/src/PipelineNet/Pipelines/IPipeline.cs index 85fadc9..325967c 100644 --- a/src/PipelineNet/Pipelines/IPipeline.cs +++ b/src/PipelineNet/Pipelines/IPipeline.cs @@ -1,5 +1,6 @@ using PipelineNet.Middleware; using System; +using System.Threading; namespace PipelineNet.Pipelines { From 52b20c64fb0cc5e65729e022a874e1631b6ba4e9 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 14 Aug 2023 22:33:27 +0500 Subject: [PATCH 09/14] changed frameword version from net5.0 to netstandard2.0, changed project version to 1.02 --- .../ChainsOfResponsibility/AsyncResponsibilityChain.cs | 4 ++-- src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs | 4 ++-- src/PipelineNet/PipelineNet.csproj | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs index ecd4536..e1a1ae5 100644 --- a/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/AsyncResponsibilityChain.cs @@ -40,9 +40,9 @@ public async Task Execute(TParameter parameter) async Task Do(TParameter _param,IEnumerator> e){ if(!e.MoveNext()){ - if(_finallyFunc is not null) + if(!(_finallyFunc is null)) return await _finallyFunc?.Invoke(_param); - return default(TReturn); + return default; } return await e.Current.Run(_param,async p=>{ return await Do(p,e); diff --git a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs index e94b576..f2437da 100644 --- a/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs +++ b/src/PipelineNet/ChainsOfResponsibility/ResponsibilityChain.cs @@ -53,9 +53,9 @@ public TReturn Execute(TParameter parameter) TReturn Do(TParameter _param,IEnumerator> e){ if(!e.MoveNext()){ - if(_finallyFunc is not null) + if(!(_finallyFunc is null)) return _finallyFunc.Invoke(_param); - return default(TReturn); + return default; } return e.Current.Run(_param,p=>{ diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index 907faaf..b64dfbf 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -1,11 +1,11 @@  - net5.0 + netstandard2.0 - 1.0.0 + 1.0.2 PipelineNet PipelineNet $(Version) From 6abcb70d6104fa60f51b26e1d9408e0fd446687c Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 14 Aug 2023 22:37:49 +0500 Subject: [PATCH 10/14] fixed csproj --- src/PipelineNet/PipelineNet.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index b64dfbf..206347a 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -6,12 +6,12 @@ 1.0.2 - PipelineNet - PipelineNet + Kemsekov.PipelineNet + Kemsekov.PipelineNet $(Version) Israel Valverde A micro framework that helps you implement pipeline and chain of responsibility patterns. - https://github.com/ipvalverde/PipelineNet + https://github.com/Kemsekov/PipelineNet https://github.com/ipvalverde/PipelineNet/blob/master/LICENSE Copyright © Israel Valverde Pipeline .NetCore Portable Chain Responsibility ChainOfResponsibility Core NetStandard From 64a59383594e673723ef0b4d4d37b9efac66c8a1 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 15 Aug 2023 13:39:59 +0500 Subject: [PATCH 11/14] added another chain function ovveride, that does not require return type --- .../MethodsChains/MethodsChain.cs | 19 +++++++++++++++++++ .../MethodsChains/IMethodsChain.cs | 8 +++++++- src/PipelineNet/MethodsChains/MethodsChain.cs | 7 ++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs b/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs index 37b11d9..d54d0aa 100644 --- a/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs +++ b/src/PipelineNet.Tests/MethodsChains/MethodsChain.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using PipelineNet.MethodsChains; using Xunit; @@ -27,5 +28,23 @@ public void MethodAbortion(){ Assert.Throws(()=>chain.Run(25)); Assert.False(reachedEnd); } + [Fact] + public void WithoutReturnType(){ + var result = new List(); + var doubleResult = new List(); + var chain = MethodsChain + .Chain(num=>(1+num).ToString()) + .Chain(numStr=>numStr+"2") + .Chain(int.Parse) + .Chain(result.Add) + .Chain(x=>doubleResult.Add(x*2)); + + chain.Run(10); + chain.Run(20); + chain.Run(30); + + Assert.Equal(new[]{112,212,312},result); + Assert.Equal(new[]{2*112,2*212,2*312},doubleResult); + } } } \ No newline at end of file diff --git a/src/PipelineNet/MethodsChains/IMethodsChain.cs b/src/PipelineNet/MethodsChains/IMethodsChain.cs index 33610f9..d8ee09e 100644 --- a/src/PipelineNet/MethodsChains/IMethodsChain.cs +++ b/src/PipelineNet/MethodsChains/IMethodsChain.cs @@ -16,7 +16,13 @@ public interface IMethodsChain /// /// Chains current chain output to next chain input. In the end works like function decorator. /// - IMethodsChain Chain(Func onCall); + IMethodsChain Chain(Func nextCall); + /// + /// Chains current chain without output - just will pass input to next chain + /// + /// + /// + IMethodsChain Chain(Action nextCall); /// /// Use to get output from input.
///
diff --git a/src/PipelineNet/MethodsChains/MethodsChain.cs b/src/PipelineNet/MethodsChains/MethodsChain.cs index 7093608..2adf48a 100644 --- a/src/PipelineNet/MethodsChains/MethodsChain.cs +++ b/src/PipelineNet/MethodsChains/MethodsChain.cs @@ -13,7 +13,7 @@ public MethodsChain(Func onCall) { OnCall = onCall; } - public static IMethodsChain Chain(Func onCall) => new MethodsChain(onCall); + public static IMethodsChain Chain(Func nextCall) => new MethodsChain(nextCall); public IMethodsChain Chain(Func nextCall) { return new MethodsChain( @@ -27,5 +27,10 @@ public IMethodsChain Chain(Func nextCall) } public TOutput Run(TInput input)=>OnCall(input); + + public IMethodsChain Chain(Action nextCall)=>Chain(x=>{ + nextCall(x); + return x; + }); } } From c299f821f9c16e4bf1b26c97604cb5e1ab48d6ec Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 15 Aug 2023 14:04:48 +0500 Subject: [PATCH 12/14] added chaining for chains itself --- .../MethodsChains/IMethodsChain.cs | 4 +++ src/PipelineNet/MethodsChains/MethodsChain.cs | 6 ++--- src/PipelineNet/PipelineNet.csproj | 2 +- src/PipelineNet/PipelineNet.sln | 25 +++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/PipelineNet/PipelineNet.sln diff --git a/src/PipelineNet/MethodsChains/IMethodsChain.cs b/src/PipelineNet/MethodsChains/IMethodsChain.cs index d8ee09e..be44730 100644 --- a/src/PipelineNet/MethodsChains/IMethodsChain.cs +++ b/src/PipelineNet/MethodsChains/IMethodsChain.cs @@ -18,6 +18,10 @@ public interface IMethodsChain ///
IMethodsChain Chain(Func nextCall); /// + /// Chains another chain + /// + IMethodsChain Chain(IMethodsChain nextCall); + /// /// Chains current chain without output - just will pass input to next chain /// /// diff --git a/src/PipelineNet/MethodsChains/MethodsChain.cs b/src/PipelineNet/MethodsChains/MethodsChain.cs index 2adf48a..73d7277 100644 --- a/src/PipelineNet/MethodsChains/MethodsChain.cs +++ b/src/PipelineNet/MethodsChains/MethodsChain.cs @@ -25,12 +25,12 @@ public IMethodsChain Chain(Func nextCall) } ); } - - public TOutput Run(TInput input)=>OnCall(input); - public IMethodsChain Chain(Action nextCall)=>Chain(x=>{ nextCall(x); return x; }); + + public IMethodsChain Chain(IMethodsChain nextCall)=>Chain(nextCall.Run); + public TOutput Run(TInput input)=>OnCall(input); } } diff --git a/src/PipelineNet/PipelineNet.csproj b/src/PipelineNet/PipelineNet.csproj index 206347a..34d24f7 100644 --- a/src/PipelineNet/PipelineNet.csproj +++ b/src/PipelineNet/PipelineNet.csproj @@ -5,7 +5,7 @@ - 1.0.2 + 1.0.3 Kemsekov.PipelineNet Kemsekov.PipelineNet $(Version) diff --git a/src/PipelineNet/PipelineNet.sln b/src/PipelineNet/PipelineNet.sln new file mode 100644 index 0000000..fe20db5 --- /dev/null +++ b/src/PipelineNet/PipelineNet.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PipelineNet", "PipelineNet.csproj", "{2EC165B9-F596-4639-83FF-A07FE6414954}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EC165B9-F596-4639-83FF-A07FE6414954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EC165B9-F596-4639-83FF-A07FE6414954}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EC165B9-F596-4639-83FF-A07FE6414954}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EC165B9-F596-4639-83FF-A07FE6414954}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4F7D3F5D-B5B1-43EA-AE5B-D5A5EA46A9F2} + EndGlobalSection +EndGlobal From e0543ac637c78f3b6c36378a62207cfe916af02e Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 15 Aug 2023 14:07:17 +0500 Subject: [PATCH 13/14] added static chain ovveride --- src/PipelineNet/MethodsChains/MethodsChain.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PipelineNet/MethodsChains/MethodsChain.cs b/src/PipelineNet/MethodsChains/MethodsChain.cs index 73d7277..7c4eba7 100644 --- a/src/PipelineNet/MethodsChains/MethodsChain.cs +++ b/src/PipelineNet/MethodsChains/MethodsChain.cs @@ -14,6 +14,7 @@ public MethodsChain(Func onCall) OnCall = onCall; } public static IMethodsChain Chain(Func nextCall) => new MethodsChain(nextCall); + public static IMethodsChain Chain(IMethodsChain nextCall) => new MethodsChain(nextCall.Run); public IMethodsChain Chain(Func nextCall) { return new MethodsChain( From 4e3b3028b30832c4467d10c95b28012aa2e9e192 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 15 Aug 2023 14:13:06 +0500 Subject: [PATCH 14/14] another static Chain method... --- src/PipelineNet/MethodsChains/MethodsChain.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/PipelineNet/MethodsChains/MethodsChain.cs b/src/PipelineNet/MethodsChains/MethodsChain.cs index 7c4eba7..125a8d8 100644 --- a/src/PipelineNet/MethodsChains/MethodsChain.cs +++ b/src/PipelineNet/MethodsChains/MethodsChain.cs @@ -15,6 +15,11 @@ public MethodsChain(Func onCall) } public static IMethodsChain Chain(Func nextCall) => new MethodsChain(nextCall); public static IMethodsChain Chain(IMethodsChain nextCall) => new MethodsChain(nextCall.Run); + public static IMethodsChain Chain(Action nextCall) => new MethodsChain(x=>{ + nextCall(x); + return x; + }); + public IMethodsChain Chain(Func nextCall) { return new MethodsChain(