导航

01-010 HttpAbstractions 之 UseMiddlewareExtensions

Posted on 2015-03-06 17:16  DotNet1010  阅读(154)  评论(0)    收藏  举报

部分代码如下:

               if (parameters.Length == 1)
                {
                    return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance);
                }
                return context =>
                {
                    var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices;
                    if (serviceProvider == null)
                    {
                        throw new Exception("TODO: IServiceProvider is not available");
                    }
                    var arguments = new object[parameters.Length];
                    arguments[0] = context;
                    for(var index = 1; index != parameters.Length; ++index)
                    {
                        var serviceType = parameters[index].ParameterType;
                        arguments[index] = serviceProvider.GetService(serviceType);
                        if (arguments[index] == null)
                        {
                            throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", serviceType));
                        }
                    }
                    return (Task)methodinfo.Invoke(instance, arguments);
                };

 上面的代码在写Middleware 时可以使得Invoke方法拥有多个方法. 第一个参数是HttpContext ,后续的参数都可以使用DI 支持的对象。

 这样减少了代码的编写量。