|
| 1 | +<Query Kind="Program" /> |
| 2 | + |
| 3 | +void Main() |
| 4 | +{ |
| 5 | + var handler = new RequestHandler(); |
| 6 | + handler.Handle(new GetAge()).Dump(); |
| 7 | + handler.Handle(new GetName()).Dump(); |
| 8 | +} |
| 9 | + |
| 10 | +public interface IRequest<T> { } |
| 11 | + |
| 12 | +public class GetAge : IRequest<int> { } |
| 13 | + |
| 14 | +public class GetName : IRequest<string> { } |
| 15 | + |
| 16 | +public interface IHandler { }; |
| 17 | + |
| 18 | +public abstract class Handler<T> : IHandler { |
| 19 | + public abstract T Handle(IRequest<T> request); |
| 20 | +}; |
| 21 | + |
| 22 | +public abstract class Handler<TRequest, TResponse> : Handler<TResponse> |
| 23 | + where TRequest : IRequest<TResponse> |
| 24 | +{ |
| 25 | + public override TResponse Handle(IRequest<TResponse> request) => |
| 26 | + Handle((TRequest) request); |
| 27 | + |
| 28 | + protected abstract TResponse Handle(TRequest requst); |
| 29 | +} |
| 30 | + |
| 31 | +public class GetAgeHandler : Handler<GetAge, int> |
| 32 | +{ |
| 33 | + protected override int Handle(GetAge request) => 20; |
| 34 | +} |
| 35 | + |
| 36 | +public class GetNameHandler : Handler<GetName, string> |
| 37 | +{ |
| 38 | + protected override string Handle(GetName request) => "Foo"; |
| 39 | +} |
| 40 | + |
| 41 | + |
| 42 | +public class RequestHandler |
| 43 | +{ |
| 44 | + public Dictionary<Type, IHandler> requestHandlers = new() { |
| 45 | + [typeof(GetAge)] = new GetAgeHandler(), |
| 46 | + [typeof(GetName)] = new GetNameHandler(), |
| 47 | + }; |
| 48 | + |
| 49 | + public T Handle<T>(IRequest<T> request) |
| 50 | + { |
| 51 | + var handler = requestHandlers[request.GetType()]; |
| 52 | + if (handler is Handler<T> h) { |
| 53 | + return h.Handle(request); |
| 54 | + } |
| 55 | + return default; |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | + |
0 commit comments