コード例 #1
0
        private static FieldDelegate CreateDelegate <TMiddleware>(
            Func <IServiceProvider, FieldDelegate, TMiddleware> factory,
            FieldDelegate next)
            where TMiddleware : class
        {
            object      sync       = new object();
            TMiddleware middleware = null;

            ClassQueryDelegate <TMiddleware, IMiddlewareContext> compiled =
                MiddlewareActivator
                .CompileMiddleware <TMiddleware, IMiddlewareContext>();

            return(context =>
            {
                if (middleware == null)
                {
                    lock (sync)
                    {
                        if (middleware == null)
                        {
                            middleware = factory(
                                context.Service <IServiceProvider>(),
                                next);
                        }
                    }
                }

                return compiled(
                    context,
                    context.Service <IServiceProvider>(),
                    middleware);
            });
        }
コード例 #2
0
        public void CompileDelegate()
        {
            // arrange
            MiddlewareFactory <CustomClassMiddleware, IServiceProvider, CustomDelegate> factory =
                MiddlewareCompiler <CustomClassMiddleware>
                .CompileFactory <IServiceProvider, CustomDelegate>(
                    (services, next) =>
                    new List <IParameterHandler>
            {
                new TypeParameterHandler(typeof(string), Expression.Constant("abc")),
                new ServiceParameterHandler(services)
            });

            CustomClassMiddleware middleware =
                factory.Invoke(new EmptyServiceProvider(), c => default);

            // act
            ClassQueryDelegate <CustomClassMiddleware, CustomContext> pipeline =
                MiddlewareCompiler <CustomClassMiddleware> .CompileDelegate <CustomContext>(
                    (context, middleware) =>
                    new List <IParameterHandler>
            {
                new TypeParameterHandler(typeof(string), Expression.Constant("def"))
            });

            // assert
            var context = new CustomContext(new EmptyServiceProvider());

            pipeline.Invoke(context, middleware);
            Assert.Equal("abcdef", context.Result);
        }
コード例 #3
0
        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);
            });
        }
コード例 #4
0
        internal static RequestDelegate CreateDelegate <TMiddleware>(
            Func <IServiceProvider, RequestDelegate, TMiddleware> factory,
            RequestDelegate next)
            where TMiddleware : class
        {
            object      sync       = new object();
            TMiddleware?middleware = null;

            ClassQueryDelegate <TMiddleware, IRequestContext> compiled =
                MiddlewareActivator.CompileMiddleware <TMiddleware, IRequestContext>();

            return(context =>
            {
                if (middleware == null)
                {
                    lock (sync)
                    {
                        if (middleware == null)
                        {
                            middleware = factory(context.Services, next);
                        }
                    }
                }

                return compiled(context, context.Services, middleware);
            });
        }
コード例 #5
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);
            });
        }