Skip to content

Commit

Permalink
made services public
Browse files Browse the repository at this point in the history
  • Loading branch information
marklauter committed Jul 22, 2024
1 parent 2a61fe6 commit 471d36f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 21 deletions.
8 changes: 7 additions & 1 deletion Plumber/IRequestHandler{TRequest, TResponse}.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics.CodeAnalysis;

namespace Plumber;

Expand All @@ -11,6 +12,11 @@ public interface IRequestHandler<TRequest, TResponse>
: IDisposable
where TRequest : class
{
/// <summary>
/// Handler level service provider.
/// </summary>
ServiceProvider Services { get; }

/// <summary>
/// The timeout for the request handler's pipeline.
/// </summary>
Expand Down
39 changes: 19 additions & 20 deletions Plumber/RequestHandler{TRequest, TResponse}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal sealed class RequestHandler<TRequest, TResponse>(
private RequestMiddleware<TRequest, TResponse>? handler;
private bool disposed;

private readonly ServiceProvider services = services?.BuildServiceProvider() ?? throw new ArgumentNullException(nameof(services));
public ServiceProvider Services { get; } = services?.BuildServiceProvider() ?? throw new ArgumentNullException(nameof(services));

public TimeSpan Timeout => timeout;

Expand Down Expand Up @@ -50,30 +50,15 @@ public IRequestHandler<TRequest, TResponse> Use(Func<RequestContext<TRequest, TR
public IRequestHandler<TRequest, TResponse> Use<[DynamicallyAccessedMembers(DynamicFlags)] TMiddleware>(params object[] parameters)
where TMiddleware : class =>
Use(next =>
new MiddlewareFactory<TMiddleware>(typeof(TMiddleware), services, next, parameters)
new MiddlewareFactory<TMiddleware>(typeof(TMiddleware), Services, next, parameters)
.CreateMiddleware());

public IRequestHandler<TRequest, TResponse> Use<[DynamicallyAccessedMembers(DynamicFlags)] TMiddleware>()
where TMiddleware : class =>
Use(next =>
new MiddlewareFactory<TMiddleware>(typeof(TMiddleware), services, next, null)
new MiddlewareFactory<TMiddleware>(typeof(TMiddleware), Services, next, null)
.CreateMiddleware());

private async Task<TResponse?> InvokeInternalAsync(TRequest request, CancellationToken cancellationToken)
{
using var serviceScope = services.CreateScope();
var context = new RequestContext<TRequest, TResponse>(
request,
Ulid.NewUlid(),
DateTime.UtcNow,
serviceScope.ServiceProvider,
cancellationToken);

await EnsureHandler()(context);

return context.Response;
}

private async Task<TResponse?> InvokeInternalAsync(TRequest request, TimeSpan timeout)
{
using var timeoutTokenSource = new CancellationTokenSource(timeout);
Expand All @@ -89,6 +74,21 @@ public IRequestHandler<TRequest, TResponse> Use(Func<RequestContext<TRequest, TR
return await InvokeInternalAsync(request, linkedTokenSource.Token);
}

private async Task<TResponse?> InvokeInternalAsync(TRequest request, CancellationToken cancellationToken)
{
using var serviceScope = Services.CreateScope();
var context = new RequestContext<TRequest, TResponse>(
request,
Ulid.NewUlid(),
DateTime.UtcNow,
serviceScope.ServiceProvider,
cancellationToken);

await EnsureHandler()(context);

return context.Response;
}

private RequestMiddleware<TRequest, TResponse> EnsureHandler() => handler ??= BuildPipeline();

private RequestMiddleware<TRequest, TResponse> BuildPipeline()
Expand Down Expand Up @@ -187,12 +187,11 @@ public void Dispose()
return;
}

services.Dispose();
Services.Dispose();

disposed = true;
}

private RequestHandler<TRequest, TResponse> ThrowIfDisposed() =>
disposed ? throw new ObjectDisposedException(GetType().FullName) : this;

}

0 comments on commit 471d36f

Please sign in to comment.