using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Pactera.Bpm.TestProject.MiddlewareTest
{
[TestFixture]
public class TestMiddleware
{
[Test]
public void TestMiddlewareImpl()
{
var context = new HttpContext();
var builder = new AppBuilder();
builder.Use(next =>
{
return (ctx) =>
{
ctx.AddMessage("m1 invoke");
next(ctx);
};
});
builder.Use(next =>
{
return (ctx) =>
{
ctx.AddMessage("m2 invoke");
next(ctx);
};
}); //app.Use((ctx, next) =>
//{
// Console.WriteLine("m3 message:{0}", ctx.Message);
// ctx.Message = "Change by m3";
// next(ctx);
//}); var app = builder.Build();
app(context); context.DisplayMessage();
}
} public class HttpContext
{
private IList<string> _message = new List<string>();
public void AddMessage(string message)
{
_message.Add(message);
} public void DisplayMessage()
{
foreach (var msg in _message)
{
Console.WriteLine(msg);
}
}
} public delegate void HttpRequestTask(HttpContext context); public class AppBuilder
{
private IList<Func<HttpRequestTask, HttpRequestTask>> middlewares = new List<Func<HttpRequestTask, HttpRequestTask>>(); public void Use(Func<HttpRequestTask, HttpRequestTask> middleware)
{
middlewares.Add(middleware);
} //public void Use(Action<CustomeHttpContext, HttpTask> middleware)
//{
// var context = new CustomeHttpContext() { Message = "inner context" }; // middlewares.Add((ctx) =>
// {
// middleware(context, HandleRequest);
// return HandleRequest;
// }); //} public void Run(Action<HttpContext> middleware)
{
//var context = new HttpContext() { Message = "inner context" };
//middleware(context);
} public HttpRequestTask Build()
{
HttpRequestTask next = (ctx) =>
{
ctx.AddMessage("Start app 404");
}; var newmiddlewares = middlewares.Reverse<Func<HttpRequestTask, HttpRequestTask>>(); foreach (var middleware in newmiddlewares)
{
next = middleware(next);
} return next;
}
}
}

c# Middleware impl的更多相关文章

  1. Python实现各类验证码识别

    项目地址: https://github.com/kerlomz/captcha_trainer 编译版下载地址: https://github.com/kerlomz/captcha_trainer ...

  2. 用Middleware给ASP.NET Core Web API添加自己的授权验证

    Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...

  3. [转]Writing Custom Middleware in ASP.NET Core 1.0

    本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...

  4. [转]用Middleware给ASP.NET Core Web API添加自己的授权验证

    本文转自:http://www.cnblogs.com/catcher1994/p/6021046.html Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做 ...

  5. Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案

    最近手头的工作不太繁重,自己试着倒腾了一套用开源框架组建的 JavaWeb 后端解决方案. 感觉还不错的样子,但实践和项目实战还是有很大的落差,这里只做抛砖引玉之用. 项目 git 地址:https: ...

  6. [译]Writing Custom Middleware in ASP.NET Core 1.0

    原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...

  7. 爬虫 htmlUnit遇到Cannot locate declared field class org.apache.http.impl.client.HttpClientBuilder.dnsResolve错误

    当在使用htmlUnit时遇到无法定位org.apache.http.impl.client.HttpClientBuilder.dnsResolver类时,此时所需要的依赖包为: <depen ...

  8. 如何在android studio 1.0 启动时设置代理【解决WARN - ateSettings.impl.UpdateChecker - Connection failed.】

    今天第一次用android studio,下了个比较新的1.0.1 linux版本,结果启动时老是出现以下错误: [ 6987] WARN - ateSettings.impl.UpdateCheck ...

  9. 使用静态函数impl模式做接口

    使用静态函数impl模式做接口 impl即桥接模式,主要是为了隐藏数据和减少不必要的编译. 普通的impl模式做接口一般是: A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B ...

随机推荐

  1. 28UDP

    UDP通信流程步骤: 服务端: 等待(被动)接收发送 1: 创建 socket:  socket() 2: 绑定端口:      bind() 3: 读取消息:      read() 4: 发送消息 ...

  2. HDU - 2204 Eddy's爱好 (数论+容斥)

    题意:求\(1 - N(1\le N \le 1e18)\)中,能表示成\(M^k(M>0,k>1)\)的数的个数 分析:正整数p可以表示成\(p = m^k = m^{r*k'}\)的形 ...

  3. NGUI混合FingerGesture《卷一》 统一坐标

    问题背景 使用FingerGesture 获取触碰点2D坐标, 将该2D坐标赋值给NGUI元素,发现位置出现偏差. 排查思路 1:NGUI的 (0,0,0)默认位置是在屏幕正中心.而FingerGes ...

  4. IOS开发-数据库总结

    关于数据存储概念: 数据结构: 基本对象:NSDictionary.NSArray和NSSet这些对象. 复杂对象:关系模型.对象图和属性列表多种结构等. 存储方式: 内存:内存存储是临时的,运行时有 ...

  5. CSS清除浮动大全的8种方法

    清除浮动是每一个 web前台设计师必须掌握的机能.css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的 ...

  6. Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

    # result 是一个字典, 把里面属性值是None的属性删除 for key in result: if not result[key]: del result[key] continue 但是报 ...

  7. 20144303 《Java程序设计》第一次实验实验报告

    20144303 <Java程序设计>第一次实验实验报告 北京电子科技学院(besti)实验报告 课程:java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 ...

  8. MR案例:外连接代码实现

    [外连接]是在[内连接]的基础上稍微修改即可.具体HQL语句详见Hive查询Join package join.map; import java.io.IOException; import java ...

  9. linux字典生成工具crunch

    安装 tar zxvf crunch-3.6.tgz cd crunch-3.6 gcc -Wall -lm -pthread -std=c99 -m64 -D_LARGEFILE_SOURCE -D ...

  10. composer安装教程 windows系统 | Linux系统 | mac系统

    如何安装 Composer 下载 Composer 安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号. 打开命令行并依次执行下列命令安装最新版本的 C ...