From 5a72ee701fbd7a95f1fcbdba877f0a9c3b5d9df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20St=C4=99pie=C5=84?= Date: Wed, 7 Aug 2024 07:46:17 +0200 Subject: [PATCH] use IServiceCollection instead of IMvcBuilder --- README.md | 5 +- .../Program.cs | 5 +- .../MvcBuilderExtensions.cs | 65 ------------------ .../ServiceCollectionExtensions.cs | 68 +++++++++++++++++++ 4 files changed, 73 insertions(+), 70 deletions(-) delete mode 100644 src/PipelineNet.ServiceProvider.AspNetCore/MvcBuilderExtensions.cs create mode 100644 src/PipelineNet.ServiceProvider.AspNetCore/ServiceCollectionExtensions.cs diff --git a/README.md b/README.md index 4332f67..b237de9 100644 --- a/README.md +++ b/README.md @@ -236,8 +236,7 @@ Install-Package PipelineNet.ServiceProvider.AspNetCore It includes extension methods for registering factories and automatic middleware registration through assembly scanning: ```C# builder.Services.AddScoped(); -builder.Services.AddControllers() - .AddPipelineNet(typeof(RoudCornersAsyncMiddleware).Assembly); // Add pipeline and chain of responsibility factories and all middleware from the assembly +builder.Services.AddPipelineNetAspNetCore(typeof(RoudCornersAsyncMiddleware).Assembly); // Add pipeline and chain of responsibility factories and all middleware from the assembly public interface IMyService { @@ -285,7 +284,7 @@ public class RoudCornersAsyncMiddleware : IAsyncMiddleware } ``` -Note that `PipelineNet.ServiceProvider.AspNetCore` uses `IHttpContextAccessor` and thus by default, cannot be used outside of HTTP request. You can create your own implementation though. +Note that `PipelineNet.ServiceProvider.AspNetCore` uses `IHttpContextAccessor` so it cannot be used outside of the HTTP request. ### Unity implementation diff --git a/src/PipelineNet.ServiceProvider.AspNetCore.Tests/Program.cs b/src/PipelineNet.ServiceProvider.AspNetCore.Tests/Program.cs index 5418b33..8d60130 100644 --- a/src/PipelineNet.ServiceProvider.AspNetCore.Tests/Program.cs +++ b/src/PipelineNet.ServiceProvider.AspNetCore.Tests/Program.cs @@ -8,11 +8,12 @@ // Add services to the container. +builder.Services.AddPipelineNetAspNetCore(typeof(RoudCornersAsyncMiddleware).Assembly); + builder.Services.AddLogging(builder => builder.Services.AddSingleton()); -builder.Services.AddControllers() - .AddPipelineNet(typeof(RoudCornersAsyncMiddleware).Assembly); +builder.Services.AddControllers(); var app = builder.Build(); diff --git a/src/PipelineNet.ServiceProvider.AspNetCore/MvcBuilderExtensions.cs b/src/PipelineNet.ServiceProvider.AspNetCore/MvcBuilderExtensions.cs deleted file mode 100644 index 4105597..0000000 --- a/src/PipelineNet.ServiceProvider.AspNetCore/MvcBuilderExtensions.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using PipelineNet.MiddlewareResolver; -using PipelineNet.ServiceProvider.AspNetCore.MiddlewareResolver; -using PipelineNet.ServiceProvider.ChainsOfResponsibility.Factories; -using PipelineNet.ServiceProvider.Pipelines.Factories; -using System; -using System.Collections.Generic; -using System.Reflection; - -namespace PipelineNet.ServiceProvider.AspNetCore -{ - /// - /// Extensions to mvc builder. - /// - public static class MvcBuilderExtensions - { - /// - /// Adds pipeline and chain of responsibility factories. Adds all middleware from assemblies. - /// - /// The mvc builder. - /// Assemblies to scan. - /// The lifetime of the registered middleware. - /// The mvc builder. - public static IMvcBuilder AddPipelineNet( - this IMvcBuilder builder, - IEnumerable assemblies, - ServiceLifetime lifetime = ServiceLifetime.Scoped) - { - if (builder == null) throw new ArgumentNullException("builder"); - if (assemblies == null) throw new ArgumentNullException("assemblies"); - - builder.Services.AddMiddlewareFromAssemblies(assemblies, lifetime); - - builder.Services.AddHttpContextAccessor(); - - builder.Services.TryAddSingleton(); - - builder.Services.TryAddSingleton(typeof(IPipelineFactory<>), typeof(AsyncPipelineFactory<>)); - builder.Services.TryAddSingleton(typeof(IAsyncPipelineFactory<>), typeof(AsyncPipelineFactory<>)); - builder.Services.TryAddSingleton(typeof(IResponsibilityChainFactory<,>), typeof(ResponsibilityChainFactory<,>)); - builder.Services.TryAddSingleton(typeof(IAsyncResponsibilityChainFactory<,>), typeof(AsyncResponsibilityChainFactory<,>)); - - return builder; - } - - /// - /// Adds pipeline and chain of responsibility factories. Adds all middleware from the assambly. - /// - /// The mvc builder. - /// The assembly to scan. - /// The lifetime of the registered middleware. - /// The mvc builder. - public static IMvcBuilder AddPipelineNet( - this IMvcBuilder builder, - Assembly assembly, - ServiceLifetime lifetime = ServiceLifetime.Scoped) - { - if (builder == null) throw new ArgumentNullException("builder"); - if (assembly == null) throw new ArgumentNullException("assembly"); - - return builder.AddPipelineNet(new[] { assembly }, lifetime); - } - } -} diff --git a/src/PipelineNet.ServiceProvider.AspNetCore/ServiceCollectionExtensions.cs b/src/PipelineNet.ServiceProvider.AspNetCore/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..c034897 --- /dev/null +++ b/src/PipelineNet.ServiceProvider.AspNetCore/ServiceCollectionExtensions.cs @@ -0,0 +1,68 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using PipelineNet.MiddlewareResolver; +using PipelineNet.ServiceProvider.AspNetCore.MiddlewareResolver; +using PipelineNet.ServiceProvider.ChainsOfResponsibility.Factories; +using PipelineNet.ServiceProvider.Pipelines.Factories; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace PipelineNet.ServiceProvider.AspNetCore +{ + /// + /// Extension methods to the service collection. + /// + public static class ServiceCollectionExtensions + { + /// + /// Adds pipeline and chain of responsibility factories. Adds all middleware from assemblies. + /// + /// The service collection. + /// Assemblies to scan. + /// The lifetime of the registered middleware. + /// The service collection. + /// Middleware instances will be resolved using the . + public static IServiceCollection AddPipelineNetAspNetCore( + this IServiceCollection services, + IEnumerable assemblies, + ServiceLifetime lifetime = ServiceLifetime.Scoped) + { + if (services == null) throw new ArgumentNullException("services"); + if (assemblies == null) throw new ArgumentNullException("assemblies"); + + services.AddMiddlewareFromAssemblies(assemblies, lifetime); + + services.AddHttpContextAccessor(); + + services.TryAddSingleton(); + + services.TryAddSingleton(typeof(IPipelineFactory<>), typeof(AsyncPipelineFactory<>)); + services.TryAddSingleton(typeof(IAsyncPipelineFactory<>), typeof(AsyncPipelineFactory<>)); + services.TryAddSingleton(typeof(IResponsibilityChainFactory<,>), typeof(ResponsibilityChainFactory<,>)); + services.TryAddSingleton(typeof(IAsyncResponsibilityChainFactory<,>), typeof(AsyncResponsibilityChainFactory<,>)); + + return services; + } + + /// + /// Adds pipeline and chain of responsibility factories. Adds all middleware from the assembly. + /// + /// The service collection. + /// The assembly to scan. + /// The lifetime of the registered middleware. + /// The service collection. + /// Middleware instances will be resolved using the . + public static IServiceCollection AddPipelineNetAspNetCore( + this IServiceCollection services, + Assembly assembly, + ServiceLifetime lifetime = ServiceLifetime.Scoped) + { + if (services == null) throw new ArgumentNullException("services"); + if (assembly == null) throw new ArgumentNullException("assembly"); + + return services.AddPipelineNetAspNetCore(new[] { assembly }, lifetime); + } + } +}