Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. sealed class CarterOptionsBuilder {
  2. delegate Task<bool> BeforeDelegate(HttpContext context);
  3. delegate Task AfterDelegate(HttpContext context);
  4.  
  5. private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
  6. private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
  7.  
  8. public CarterOptionsBuilder HandleBefore(Func<HttpContext, Task<bool>> before) {
  9. befores.Push(next => async context => {
  10. return await before(context) && await next(context);
  11. });
  12. return this;
  13. }
  14.  
  15. public CarterOptionsBuilder HandleAfter(Func<HttpContext, Task> after) {
  16. afters.Push(next => context => {
  17. after(context);
  18. return next(context);
  19. });
  20. return this;
  21. }
  22.  
  23. public CarterOptions Build() {
  24. var before = new BeforeDelegate(c => Task.FromResult(true));
  25. while (befores.Any()) {
  26. var current = befores.Pop();
  27. before = current(before);
  28. }
  29. var after = new AfterDelegate(c => Task.CompletedTask);
  30. while (afters.Any()) {
  31. var current = afters.Pop();
  32. after = current(after);
  33. }
  34. return new CarterOptions(before.Invoke, after.Invoke);
  35. }
  36. }
  37.  
  38. public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
  39. CarterOptions options = new CarterOptionsBuilder()
  40. .HandleBefore(this.AddRequestId)
  41. .HandleBefore(this.BeforeLog)
  42. .HandleAfter(this.AfterLog)
  43. .Build();
  44.  
  45. app.UseCarter(options);
  46. }
  47.  
  48. private Task AfterLog(HttpContext arg) {
  49. //...
  50. return Task.CompletedTask;
  51. }
  52.  
  53. private Task<bool> BeforeLog(HttpContext arg) {
  54. //...
  55. return Task.FromResult(true);
  56. }
  57.  
  58. private Task<bool> AddRequestId(HttpContext ctx) {
  59. ctx.Request.Header["x-request-id"] = Guid.NewGuid().ToString();
  60. return Task.FromResult(true);
  61. }
  62.  
  63. public static CarterOptionsBuilder AddLog(this CarterOptionsBuilder builder) {
  64. return builder
  65. .HandleBefore(this.BeforeLog)
  66. .HandleAfter(this.AfterLog);
  67. }
  68. private static Task AfterLog(HttpContext arg) {
  69. //...
  70. return Task.CompletedTask;
  71. }
  72.  
  73. private static Task<bool> BeforeLog(HttpContext arg) {
  74. //...
  75. return Task.FromResult(true);
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement