sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder HandleBeforeAddBeforeHook(Func<HttpContext, Task<bool>> handler) {
befores.Push(next => async context => {
return await handler(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder HandleAfterAddAfterHook(Func<HttpContext, Task> handler) {
afters.Push(next => context => {
handler(context);
return next(context);
});
return this;
}
public CarterOptions Build(OpenApiOptions openApiOptions = null) {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke, openApiOptions);
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
CarterOptions options = new CarterOptionsBuilder()
.HandleBeforeAddBeforeHook(this.AddRequestId)
.HandleBeforeAddBeforeHook(this.BeforeLog)
.HandleAfterAddAfterHook(this.AfterLog)
.Build();
app.UseCarter(options);
}
private Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
private Task<bool> AddRequestId(HttpContext ctx) {
ctx.Request.Header["x-request-id"] = Guid.NewGuid().ToString();
return Task.FromResult(true);
}
public static CarterOptionsBuilder AddLog(this CarterOptionsBuilder builder) {
return builder
.HandleBeforeAddBeforeHook(this.BeforeLog)
.HandleAfterAddAfterHook(this.AfterLog);
}
private static Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private static Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder HandleBefore(Func<HttpContext, Task<bool>> handler) {
befores.Push(next => async context => {
return await handler(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder HandleAfter(Func<HttpContext, Task> handler) {
afters.Push(next => context => {
handler(context);
return next(context);
});
return this;
}
public CarterOptions Build(OpenApiOptions openApiOptions = null) {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke, openApiOptions);
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
CarterOptions options = new CarterOptionsBuilder()
.HandleBefore(this.AddRequestId)
.HandleBefore(this.BeforeLog)
.HandleAfter(this.AfterLog)
.Build();
app.UseCarter(options);
}
private Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
private Task<bool> AddRequestId(HttpContext ctx) {
ctx.Request.Header["x-request-id"] = Guid.NewGuid().ToString();
return Task.FromResult(true);
}
public static CarterOptionsBuilder AddLog(this CarterOptionsBuilder builder) {
return builder
.HandleBefore(this.BeforeLog)
.HandleAfter(this.AfterLog);
}
private static Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private static Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder AddBeforeHook(Func<HttpContext, Task<bool>> handler) {
befores.Push(next => async context => {
return await handler(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder AddAfterHook(Func<HttpContext, Task> handler) {
afters.Push(next => context => {
handler(context);
return next(context);
});
return this;
}
public CarterOptions Build(OpenApiOptions openApiOptions = null) {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke, openApiOptions);
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
CarterOptions options = new CarterOptionsBuilder()
.AddBeforeHook(this.AddRequestId)
.AddBeforeHook(this.BeforeLog)
.AddAfterHook(this.AfterLog)
.Build();
app.UseCarter(options);
}
private Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
private Task<bool> AddRequestId(HttpContext ctx) {
ctx.Request.Header["x-request-id"] = Guid.NewGuid().ToString();
return Task.FromResult(true);
}
public static CarterOptionsBuilder AddLog(this CarterOptionsBuilder builder) {
return builder
.AddBeforeHook(this.BeforeLog)
.AddAfterHook(this.AfterLog);
}
private static Task AfterLog(HttpContext arg) {
//...
return Task.CompletedTask;
}
private static Task<bool> BeforeLog(HttpContext arg) {
//...
return Task.FromResult(true);
}
sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder HandleBefore(Func<HttpContext, Task<bool>> beforehandler) {
befores.Push(next => async context => {
return await beforehandler(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder HandleAfter(Func<HttpContext, Task> afterhandler) {
afters.Push(next => context => {
afterhandler(context);
return next(context);
});
return this;
}
public CarterOptions Build(OpenApiOptions openApiOptions = null) {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke, openApiOptions);
}
}
sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder HandleBefore(Func<HttpContext, Task<bool>> before) {
befores.Push(next => async context => {
return await before(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder HandleAfter(Func<HttpContext, Task> after) {
afters.Push(next => context => {
after(context);
return next(context);
});
return this;
}
public CarterOptions Build() {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke);
}
}
sealed class CarterOptionsBuilder {
delegate Task<bool> BeforeDelegate(HttpContext context);
delegate Task AfterDelegate(HttpContext context);
private readonly Stack<Func<BeforeDelegate, BeforeDelegate>> befores = new Stack<Func<BeforeDelegate, BeforeDelegate>>();
private readonly Stack<Func<AfterDelegate, AfterDelegate>> afters = new Stack<Func<AfterDelegate, AfterDelegate>>();
public CarterOptionsBuilder HandleBefore(Func<HttpContext, Task<bool>> handler) {
befores.Push(next => async context => {
return await handler(context) && await next(context);
});
return this;
}
public CarterOptionsBuilder HandleAfter(Func<HttpContext, Task> handler) {
afters.Push(next => context => {
handler(context);
return next(context);
});
return this;
}
public CarterOptions Build(OpenApiOptions openApiOptions = null) {
var before = new BeforeDelegate(c => Task.FromResult(true));
while (befores.Any()) {
var current = befores.Pop();
before = current(before);
}
var after = new AfterDelegate(c => Task.CompletedTask);
while (afters.Any()) {
var current = afters.Pop();
after = current(after);
}
return new CarterOptions(before.Invoke, after.Invoke, openApiOptions);
}
}
lang-cs