Updated PHASENPLAN and ROADMAP to reflect progress on Feature 1 - ValidatePDF (75% complete). Marked Step 1.1 as completed, including MediatR setup, pipeline behaviors (`ValidationBehavior`, `LoggingBehavior`), ValidatePDF feature (Query, Handler, Validator), and DTOs. Added `DependencyInjection.cs` for Application Layer DI configuration. Introduced `LoggingBehavior` and `ValidationBehavior` for MediatR pipelines. Implemented `ValidatePdfHandler`, `ValidatePdfQuery`, and `ValidatePdfValidator`. Created DTOs (`ValidatePdfRequest`, `ValidatePdfResponse`) for the ValidatePDF feature. Added unit tests for `ValidatePdfHandler` to verify metadata handling and exception propagation. Removed unused folder references in `DocumentOperator.Application.csproj`.
67 lines
1.8 KiB
C#
67 lines
1.8 KiB
C#
using MediatR;
|
|
using Microsoft.Extensions.Logging;
|
|
using System.Diagnostics;
|
|
|
|
namespace DocumentOperator.Application.Common.Behaviors;
|
|
|
|
/// <summary>
|
|
/// MediatR Pipeline Behavior that logs requests and tracks performance
|
|
/// Executes AFTER ValidationBehavior, BEFORE Handler
|
|
/// </summary>
|
|
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
|
where TRequest : IRequest<TResponse>
|
|
{
|
|
private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;
|
|
|
|
public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<TResponse> Handle(
|
|
TRequest request,
|
|
RequestHandlerDelegate<TResponse> next,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var requestName = typeof(TRequest).Name;
|
|
|
|
// Request Start
|
|
_logger.LogInformation("Handling {RequestName}: {@Request}", requestName, request);
|
|
|
|
// Performance Tracking
|
|
var stopwatch = Stopwatch.StartNew();
|
|
|
|
try
|
|
{
|
|
// Handler ausführen
|
|
var response = await next();
|
|
|
|
stopwatch.Stop();
|
|
|
|
// Request Success
|
|
_logger.LogInformation(
|
|
"Handled {RequestName} in {ElapsedMs}ms",
|
|
requestName,
|
|
stopwatch.ElapsedMilliseconds
|
|
);
|
|
|
|
return response;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
stopwatch.Stop();
|
|
|
|
// Request Failed
|
|
_logger.LogError(
|
|
ex,
|
|
"Error handling {RequestName} after {ElapsedMs}ms: {ErrorMessage}",
|
|
requestName,
|
|
stopwatch.ElapsedMilliseconds,
|
|
ex.Message
|
|
);
|
|
|
|
throw; // Exception weiterwerfen (wird von Exception Middleware gefangen)
|
|
}
|
|
}
|
|
}
|