internal static DirectiveDelegate CreateDelegate <TMiddleware>( Func <IServiceProvider, FieldDelegate, TMiddleware> factory, FieldDelegate next) where TMiddleware : class { object sync = new object(); TMiddleware middleware = null; ClassQueryDelegate <TMiddleware, IDirectiveContext> compiled = MiddlewareCompiler <TMiddleware> .CompileDelegate <IDirectiveContext>( (context, middleware) => new List <IParameterHandler> { new ServiceParameterHandler(Expression.Property(context, _services)) }); return(context => { if (middleware is null) { lock (sync) { middleware = middleware ?? factory(context.Services, next); } } return compiled(context, middleware); }); }
internal static RequestCoreMiddleware Create <TMiddleware>() where TMiddleware : class { return((context, next) => { TMiddleware middleware = MiddlewareCompiler <TMiddleware> .CompileFactory <IRequestCoreMiddlewareContext, RequestDelegate>( (c, n) => CreateFactoryParameterHandlers(c, context.Options)) .Invoke(context, next); ClassQueryDelegate <TMiddleware, IRequestContext> compiled = MiddlewareCompiler <TMiddleware> .CompileDelegate <IRequestContext>( (c, m) => CreateDelegateParameterHandlers(c, context.Options)); return c => compiled(c, middleware); }); }