-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDecorators.cs
More file actions
84 lines (68 loc) · 2.99 KB
/
Decorators.cs
File metadata and controls
84 lines (68 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using softaware.Cqs.Benchmarks.Contracts;
namespace softaware.Cqs.Benchmarks.Decorators;
/// <summary>
/// Applies to ALL requests (where TRequest : IRequest<TResult>).
/// Simulates a logging/telemetry decorator.
/// </summary>
public class LoggingDecorator<TRequest, TResult> : IRequestHandler<TRequest, TResult>
where TRequest : IRequest<TResult>
{
private readonly IRequestHandler<TRequest, TResult> decoratee;
public LoggingDecorator(IRequestHandler<TRequest, TResult> decoratee)
=> this.decoratee = decoratee;
public Task<TResult> HandleAsync(TRequest request, CancellationToken ct)
=> this.decoratee.HandleAsync(request, ct);
}
/// <summary>
/// Applies only to COMMANDS (where TRequest : ICommand<TResult>).
/// Simulates a transaction decorator.
/// </summary>
public class TransactionDecorator<TRequest, TResult> : IRequestHandler<TRequest, TResult>
where TRequest : ICommand<TResult>
{
private readonly IRequestHandler<TRequest, TResult> decoratee;
public TransactionDecorator(IRequestHandler<TRequest, TResult> decoratee)
=> this.decoratee = decoratee;
public Task<TResult> HandleAsync(TRequest request, CancellationToken ct)
=> this.decoratee.HandleAsync(request, ct);
}
/// <summary>
/// Applies only to QUERIES (where TRequest : IQuery<TResult>).
/// Simulates a caching decorator.
/// </summary>
public class CachingDecorator<TRequest, TResult> : IRequestHandler<TRequest, TResult>
where TRequest : IQuery<TResult>
{
private readonly IRequestHandler<TRequest, TResult> decoratee;
public CachingDecorator(IRequestHandler<TRequest, TResult> decoratee)
=> this.decoratee = decoratee;
public Task<TResult> HandleAsync(TRequest request, CancellationToken ct)
=> this.decoratee.HandleAsync(request, ct);
}
/// <summary>
/// Applies only to requests implementing IAccessChecked (multiple interface constraints).
/// </summary>
public class AccessCheckDecorator<TRequest, TResult> : IRequestHandler<TRequest, TResult>
where TRequest : IRequest<TResult>, IAccessChecked
{
private readonly IRequestHandler<TRequest, TResult> decoratee;
public AccessCheckDecorator(IRequestHandler<TRequest, TResult> decoratee)
=> this.decoratee = decoratee;
public Task<TResult> HandleAsync(TRequest request, CancellationToken ct)
{
request.AccessCheckEvaluated = true;
return this.decoratee.HandleAsync(request, ct);
}
}
/// <summary>
/// Applies only to prioritized commands (two constraints: ICommand + IPrioritized).
/// </summary>
public class PriorityDecorator<TRequest, TResult> : IRequestHandler<TRequest, TResult>
where TRequest : ICommand<TResult>, IPrioritized
{
private readonly IRequestHandler<TRequest, TResult> decoratee;
public PriorityDecorator(IRequestHandler<TRequest, TResult> decoratee)
=> this.decoratee = decoratee;
public Task<TResult> HandleAsync(TRequest request, CancellationToken ct)
=> this.decoratee.HandleAsync(request, ct);
}