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 DirectiveMiddleware Create <TMiddleware>()
            where TMiddleware : class
        {
            return(next =>
            {
                MiddlewareFactory <TMiddleware, IServiceProvider, FieldDelegate> factory =
                    MiddlewareCompiler <TMiddleware>
                    .CompileFactory <IServiceProvider, FieldDelegate>(
                        (services, next) =>
                        new IParameterHandler[] { new ServiceParameterHandler(services) });

                return CreateDelegate(
                    (s, n) => factory(s, n),
                    next);
            });
        }
Exemplo n.º 3
0
        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);
            });
        }