/// <summary>使用 /// </summary> public static IRestPipelineBuilder Use(this IRestPipelineBuilder app, Func <RestExecuteContext, Func <Task>, Task> middleware) { return(app.Use(next => { return context => { Func <Task> simpleNext = () => next(context); return middleware(context, simpleNext); }; })); }
/// <summary>使用管道 /// </summary> /// <returns></returns> public static IRestPipelineBuilder UseMiddleware(this IRestPipelineBuilder app, Type middleware, params object[] args) { return(app.Use(next => { var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal) || string.Equals(m.Name, InvokeAsyncMethodName, StringComparison.Ordinal) ).ToArray(); if (invokeMethods.Length > 1) { throw new InvalidOperationException(); } if (invokeMethods.Length == 0) { throw new InvalidOperationException(); } var methodinfo = invokeMethods[0]; if (!typeof(Task).IsAssignableFrom(methodinfo.ReturnType)) { throw new InvalidOperationException(); } var parameters = methodinfo.GetParameters(); if (parameters.Length == 0 || parameters[0].ParameterType != typeof(RestExecuteContext)) { throw new InvalidOperationException(); } var ctorArgs = new object[args.Length + 1]; ctorArgs[0] = next; Array.Copy(args, 0, ctorArgs, 1, args.Length); var instance = ActivatorUtilities.CreateInstance(app.Provider, middleware, ctorArgs); var quickPayExecuteDelegate = (RestExecuteDelegate)methodinfo.CreateDelegate(typeof(RestExecuteDelegate), instance); return context => { return quickPayExecuteDelegate(context); }; })); }
/// <summary>Ctor /// </summary> public SeaweedfsExecuter(ILoggerFactory loggerFactory, IRestExecuteContextFactory restExecuteContextFactory, IRestPipelineBuilder restPipelineBuilder) { _logger = loggerFactory.CreateLogger(SeaweedfsConsts.LoggerName); _restExecuteContextFactory = restExecuteContextFactory; _restPipelineBuilder = restPipelineBuilder; }
/// <summary>使用管道 /// </summary> public static IRestPipelineBuilder UseMiddleware <TMiddleware>(this IRestPipelineBuilder app, params object[] args) { return(app.UseMiddleware(typeof(TMiddleware), args)); }