From a9025be5054e7cf5d1ba867127e0997b00c7e1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=9B=BD=E4=BC=9F?= <366193849@qq.com> Date: Wed, 16 Jun 2021 09:25:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E6=9E=9C=E6=89=AB=E6=8F=8F=E4=B8=8E?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=90=9C=E7=B4=A2=E4=B8=8D=E5=85=B1=E7=94=A8?= =?UTF-8?q?=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.Core/FastGithub.Core.csproj | 1 + .../IMiddleware.cs | 9 +- FastGithub.Core/IPipelineBuilder.cs | 54 +++++++++ .../InvokeDelegate.cs | 7 +- FastGithub.Core/PipelineBuilder.cs | 103 ++++++++++++++++++ FastGithub.Core/PipelineBuilderExtensions.cs | 71 ++++++++++++ FastGithub.Scanner/GithubScanBuilder.cs | 66 ----------- .../GithubScanBuilderExtensions.cs | 36 ------ FastGithub.Scanner/GithubScanService.cs | 31 ++++-- FastGithub.Scanner/IGithubScanBuilder.cs | 28 ----- .../Middlewares/ConcurrentMiddleware.cs | 2 +- .../Middlewares/HttpsScanMiddleware.cs | 2 +- .../Middlewares/PortScanMiddleware.cs | 2 +- .../Middlewares/ScanOkLogMiddleware.cs | 2 +- .../ScannerServiceCollectionExtensions.cs | 14 +-- 15 files changed, 270 insertions(+), 158 deletions(-) rename FastGithub.Scanner/IGithubScanMiddleware.cs => FastGithub.Core/IMiddleware.cs (63%) create mode 100644 FastGithub.Core/IPipelineBuilder.cs rename FastGithub.Scanner/GithubScanDelegate.cs => FastGithub.Core/InvokeDelegate.cs (50%) create mode 100644 FastGithub.Core/PipelineBuilder.cs create mode 100644 FastGithub.Core/PipelineBuilderExtensions.cs delete mode 100644 FastGithub.Scanner/GithubScanBuilder.cs delete mode 100644 FastGithub.Scanner/GithubScanBuilderExtensions.cs delete mode 100644 FastGithub.Scanner/IGithubScanBuilder.cs diff --git a/FastGithub.Core/FastGithub.Core.csproj b/FastGithub.Core/FastGithub.Core.csproj index 9b80a69..bbb414c 100644 --- a/FastGithub.Core/FastGithub.Core.csproj +++ b/FastGithub.Core/FastGithub.Core.csproj @@ -3,6 +3,7 @@ net5.0 enable + FastGithub diff --git a/FastGithub.Scanner/IGithubScanMiddleware.cs b/FastGithub.Core/IMiddleware.cs similarity index 63% rename from FastGithub.Scanner/IGithubScanMiddleware.cs rename to FastGithub.Core/IMiddleware.cs index d1cdf62..5eeb445 100644 --- a/FastGithub.Scanner/IGithubScanMiddleware.cs +++ b/FastGithub.Core/IMiddleware.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; -namespace FastGithub.Scanner +namespace FastGithub { /// /// 定义中间件的接口 - /// - interface IGithubScanMiddleware + /// + /// + public interface IMiddleware { /// /// 执行中间件 @@ -14,6 +15,6 @@ namespace FastGithub.Scanner /// 上下文 /// 下一个中间件 /// - Task InvokeAsync(GithubContext context, Func next); + Task InvokeAsync(TContext context, Func next); } } diff --git a/FastGithub.Core/IPipelineBuilder.cs b/FastGithub.Core/IPipelineBuilder.cs new file mode 100644 index 0000000..2c68118 --- /dev/null +++ b/FastGithub.Core/IPipelineBuilder.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; + +namespace FastGithub +{ + /// + /// 定义中间件管道创建者的接口 + /// + /// 中间件上下文 + public interface IPipelineBuilder + { + /// + /// 获取服务提供者 + /// + IServiceProvider AppServices { get; } + + /// + /// 使用中间件 + /// + /// + /// + /// + /// + IPipelineBuilder Use() where TMiddleware : class, IMiddleware; + + /// + /// 使用中间件 + /// + /// + /// + /// + /// + IPipelineBuilder Use(Func, Task> middleware); + + /// + /// 使用中间件 + /// + /// 中间件 + /// + IPipelineBuilder Use(Func, InvokeDelegate> middleware); + + /// + /// 创建所有中间件执行处理者 + /// + /// + InvokeDelegate Build(); + + /// + /// 使用默认配制创建新的PipelineBuilder + /// + /// + IPipelineBuilder New(); + } +} diff --git a/FastGithub.Scanner/GithubScanDelegate.cs b/FastGithub.Core/InvokeDelegate.cs similarity index 50% rename from FastGithub.Scanner/GithubScanDelegate.cs rename to FastGithub.Core/InvokeDelegate.cs index 7ae6c83..985d433 100644 --- a/FastGithub.Scanner/GithubScanDelegate.cs +++ b/FastGithub.Core/InvokeDelegate.cs @@ -1,11 +1,12 @@ using System.Threading.Tasks; -namespace FastGithub.Scanner +namespace FastGithub { /// /// 表示所有中间件执行委托 - /// + /// + /// 中间件上下文类型 /// 中间件上下文 /// - delegate Task GithubScanDelegate(GithubContext context); + public delegate Task InvokeDelegate(TContext context); } diff --git a/FastGithub.Core/PipelineBuilder.cs b/FastGithub.Core/PipelineBuilder.cs new file mode 100644 index 0000000..ae5cf02 --- /dev/null +++ b/FastGithub.Core/PipelineBuilder.cs @@ -0,0 +1,103 @@ +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace FastGithub +{ + /// + /// 表示中间件创建者 + /// + public class PipelineBuilder : IPipelineBuilder + { + private readonly InvokeDelegate completedHandler; + private readonly List, InvokeDelegate>> middlewares = new List, InvokeDelegate>>(); + + /// + /// 获取服务提供者 + /// + public IServiceProvider AppServices { get; } + + /// + /// 中间件创建者 + /// + /// + public PipelineBuilder(IServiceProvider appServices) + : this(appServices, context => Task.CompletedTask) + { + } + + /// + /// 中间件创建者 + /// + /// + /// 完成执行内容处理者 + public PipelineBuilder(IServiceProvider appServices, InvokeDelegate completedHandler) + { + this.AppServices = appServices; + this.completedHandler = completedHandler; + } + + + /// + /// 使用中间件 + /// + /// + /// + /// + /// + public IPipelineBuilder Use() where TMiddleware : class, IMiddleware + { + var middleware = this.AppServices.GetRequiredService(); + return this.Use(middleware.InvokeAsync); + } + + /// + /// 使用中间件 + /// + /// + /// + /// + /// + public IPipelineBuilder Use(Func, Task> middleware) + { + return this.Use(next => context => middleware(context, () => next(context))); + } + + /// + /// 使用中间件 + /// + /// + /// + public IPipelineBuilder Use(Func, InvokeDelegate> middleware) + { + this.middlewares.Add(middleware); + return this; + } + + + /// + /// 创建所有中间件执行处理者 + /// + /// + public InvokeDelegate Build() + { + var handler = this.completedHandler; + for (var i = this.middlewares.Count - 1; i >= 0; i--) + { + handler = this.middlewares[i](handler); + } + return handler; + } + + + /// + /// 使用默认配制创建新的PipelineBuilder + /// + /// + public IPipelineBuilder New() + { + return new PipelineBuilder(this.AppServices, this.completedHandler); + } + } +} \ No newline at end of file diff --git a/FastGithub.Core/PipelineBuilderExtensions.cs b/FastGithub.Core/PipelineBuilderExtensions.cs new file mode 100644 index 0000000..67a585b --- /dev/null +++ b/FastGithub.Core/PipelineBuilderExtensions.cs @@ -0,0 +1,71 @@ +using System; + +namespace FastGithub +{ + /// + /// 中间件创建者扩展 + /// + public static class PipelineBuilderExtensions + { + /// + /// 中断执行中间件 + /// + /// + /// + /// 处理者 + /// + public static IPipelineBuilder Run(this IPipelineBuilder builder, InvokeDelegate handler) + { + return builder.Use(_ => handler); + } + + /// + /// 条件中间件 + /// + /// + /// + /// + /// + /// + public static IPipelineBuilder When(this IPipelineBuilder builder, Func predicate, InvokeDelegate handler) + { + return builder.Use(next => async context => + { + if (predicate.Invoke(context) == true) + { + await handler.Invoke(context); + } + else + { + await next(context); + } + }); + } + + + /// + /// 条件中间件 + /// + /// + /// + /// + /// + /// + public static IPipelineBuilder When(this IPipelineBuilder builder, Func predicate, Action> configureAction) + { + return builder.Use(next => async context => + { + if (predicate.Invoke(context) == true) + { + var branchBuilder = builder.New(); + configureAction(branchBuilder); + await branchBuilder.Build().Invoke(context); + } + else + { + await next(context); + } + }); + } + } +} diff --git a/FastGithub.Scanner/GithubScanBuilder.cs b/FastGithub.Scanner/GithubScanBuilder.cs deleted file mode 100644 index 077e0a3..0000000 --- a/FastGithub.Scanner/GithubScanBuilder.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace FastGithub.Scanner -{ - /// - /// 表示中间件创建者 - /// - sealed class GithubScanBuilder : IGithubScanBuilder - { - private readonly GithubScanDelegate completedHandler; - private readonly List> middlewares = new(); - - /// - /// 获取服务提供者 - /// - public IServiceProvider AppServices { get; } - - /// - /// 中间件创建者 - /// - /// - public GithubScanBuilder(IServiceProvider appServices) - : this(appServices, context => Task.CompletedTask) - { - } - - /// - /// 中间件创建者 - /// - /// - /// 完成执行内容处理者 - public GithubScanBuilder(IServiceProvider appServices, GithubScanDelegate completedHandler) - { - this.AppServices = appServices; - this.completedHandler = completedHandler; - } - - /// - /// 使用中间件 - /// - /// - /// - public IGithubScanBuilder Use(Func middleware) - { - this.middlewares.Add(middleware); - return this; - } - - - /// - /// 创建所有中间件执行处理者 - /// - /// - public GithubScanDelegate Build() - { - var handler = this.completedHandler; - for (var i = this.middlewares.Count - 1; i >= 0; i--) - { - handler = this.middlewares[i](handler); - } - return handler; - } - } -} \ No newline at end of file diff --git a/FastGithub.Scanner/GithubScanBuilderExtensions.cs b/FastGithub.Scanner/GithubScanBuilderExtensions.cs deleted file mode 100644 index e70cca5..0000000 --- a/FastGithub.Scanner/GithubScanBuilderExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace FastGithub.Scanner -{ - /// - /// 中间件创建者扩展 - /// - static class GithubScanBuilderExtensions - { - /// - /// 使用中间件 - /// - /// - /// - /// - public static IGithubScanBuilder Use(this IGithubScanBuilder builder) where TMiddleware : class, IGithubScanMiddleware - { - return builder.AppServices.GetService(typeof(TMiddleware)) is TMiddleware middleware - ? builder.Use(middleware.InvokeAsync) - : throw new InvalidOperationException($"无法获取服务{typeof(TMiddleware)}"); - } - - /// - /// 使用中间件 - /// - /// - /// - /// - /// - public static IGithubScanBuilder Use(this IGithubScanBuilder builder, Func, Task> middleware) - { - return builder.Use(next => context => middleware(context, () => next(context))); - } - } -} diff --git a/FastGithub.Scanner/GithubScanService.cs b/FastGithub.Scanner/GithubScanService.cs index 795b81c..e44c74b 100644 --- a/FastGithub.Scanner/GithubScanService.cs +++ b/FastGithub.Scanner/GithubScanService.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using FastGithub.Scanner.Middlewares; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Linq; @@ -12,18 +13,34 @@ namespace FastGithub.Scanner sealed class GithubScanService : IGithubScanService { private readonly GithubMetaService metaService; - private readonly GithubScanDelegate scanDelegate; private readonly ILogger logger; private readonly GithubContextHashSet results = new(); + private readonly InvokeDelegate fullScanDelegate; + private readonly InvokeDelegate resultScanDelegate; + public GithubScanService( GithubMetaService metaService, - GithubScanDelegate scanDelegate, - ILogger logger) + ILogger logger, + IPipelineBuilder pipelineBuilder) { this.metaService = metaService; - this.scanDelegate = scanDelegate; this.logger = logger; + + this.fullScanDelegate = pipelineBuilder + .New() + .Use() + .Use() + .Use() + .Use() + .Build(); + + this.resultScanDelegate = pipelineBuilder + .New() + .Use() + .Use() + .Use() + .Build(); } public async Task ScanAllAsync(CancellationToken cancellationToken = default) @@ -40,7 +57,7 @@ namespace FastGithub.Scanner async Task ScanAsync(GithubContext context) { - await this.scanDelegate(context); + await this.fullScanDelegate(context); if (context.HttpElapsed != null) { lock (this.results.SyncRoot) @@ -63,7 +80,7 @@ namespace FastGithub.Scanner foreach (var context in contexts) { context.HttpElapsed = null; - await this.scanDelegate(context); + await this.resultScanDelegate(context); } this.logger.LogInformation("结果扫描结束"); diff --git a/FastGithub.Scanner/IGithubScanBuilder.cs b/FastGithub.Scanner/IGithubScanBuilder.cs deleted file mode 100644 index 3ad3453..0000000 --- a/FastGithub.Scanner/IGithubScanBuilder.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace FastGithub.Scanner -{ - /// - /// 定义中间件管道创建者的接口 - /// - interface IGithubScanBuilder - { - /// - /// 获取服务提供者 - /// - IServiceProvider AppServices { get; } - - /// - /// 使用中间件 - /// - /// 中间件 - /// - IGithubScanBuilder Use(Func middleware); - - /// - /// 创建所有中间件执行处理者 - /// - /// - GithubScanDelegate Build(); - } -} diff --git a/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs index 918b2dc..0a18c72 100644 --- a/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs +++ b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace FastGithub.Scanner.Middlewares { [Service(ServiceLifetime.Singleton)] - sealed class ConcurrentMiddleware : IGithubScanMiddleware + sealed class ConcurrentMiddleware : IMiddleware { private readonly SemaphoreSlim semaphoreSlim = new(Environment.ProcessorCount * 4); diff --git a/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs index e974495..09119b6 100644 --- a/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs +++ b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace FastGithub.Scanner.Middlewares { [Service(ServiceLifetime.Singleton)] - sealed class HttpsScanMiddleware : IGithubScanMiddleware + sealed class HttpsScanMiddleware : IMiddleware { private readonly IOptionsMonitor options; private readonly ILogger logger; diff --git a/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs index f3058c9..5f6f555 100644 --- a/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs +++ b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace FastGithub.Scanner.Middlewares { [Service(ServiceLifetime.Singleton)] - sealed class PortScanMiddleware : IGithubScanMiddleware + sealed class PortScanMiddleware : IMiddleware { private const int PORT = 443; private readonly IOptionsMonitor options; diff --git a/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs index 52aafc5..3730642 100644 --- a/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs +++ b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace FastGithub.Scanner.Middlewares { [Service(ServiceLifetime.Singleton)] - sealed class ScanOkLogMiddleware : IGithubScanMiddleware + sealed class ScanOkLogMiddleware : IMiddleware { private readonly ILogger logger; diff --git a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs index 8fd9137..a3d9572 100644 --- a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs +++ b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs @@ -1,5 +1,4 @@ using FastGithub.Scanner; -using FastGithub.Scanner.Middlewares; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Threading.Tasks; @@ -22,18 +21,13 @@ namespace FastGithub var assembly = typeof(ScannerServiceCollectionExtensions).Assembly; return services .AddHttpClient() - .AddSingleton(serviceProvider => - { - return new GithubScanBuilder(serviceProvider, ctx => Task.CompletedTask) - .Use() - .Use() - .Use() - .Use() - .Build(); - }) .AddServiceAndOptions(assembly, configuration) .AddHostedService() .AddHostedService() + .AddSingleton>(appService => + { + return new PipelineBuilder(appService, ctx => Task.CompletedTask); + }) ; } }