做职业装的网站,免费企业网站开源系统,代码编程教学入门软件,dw做的网站如何用手机看如上图所示#xff1a;我们将会在下面文章上一步一步变形实现出这样的功能。一、傻瓜式执行演示首先建立控制台项目#xff0c;创建Begin() FirstMiddleware() SecondMiddleware() End() 三个函数1 /// summary2 /// 开始执行前3 /// /summ… 如上图所示我们将会在下面文章上一步一步变形实现出这样的功能。一、傻瓜式执行演示首先建立控制台项目创建Begin() FirstMiddleware() SecondMiddleware() End() 三个函数1 /// summary2 /// 开始执行前3 /// /summary4 public static void Begin()5 {6 Console.WriteLine(begin executing);7 }89 /// summary
10 /// 执行结束
11 /// /summary
12 public static void End()
13 {
14 Console.WriteLine(end executed);
15 }
16
17 public static void FirstMiddleware()
18 {
19 Console.WriteLine(第一个中间件);
20 }
21 public static void SecondMiddleware()
22 {
23 Console.WriteLine(第二个中间件);
24 }按照如下顺序执行并显示结果1 static void Main(string[] args)2 {3 //Console.WriteLine(Hello World!);4 #region 傻瓜式演示中间件执行方法5 Begin();6 FirstMiddleware();7 End();8 Console.WriteLine(-------------------);9 Begin();
10 SecondMiddleware();
11 End();
12 #endregion
13 }二、封装傻瓜式执行函数这个Begin() End() 两个方法会执行多次所以我们可以选择封装一下1 /// summary2 /// 封装一个执行方法 减少重复代码3 /// 入参可以传递一个无参数 无返回值函数 用内置委托接受4 /// /summary5 /// param namefunction/param6 public static void CommonExecute(Action function)7 {8 Begin();9 function();
10 End();
11 }如下调用,执行结果和前文一样1 #region 封装傻瓜式执行函数
2 CommonExecute(FirstMiddleware);
3 Console.WriteLine(-------------------);
4 CommonExecute(SecondMiddleware);
5 #endregion三、利用lambda变形简化这里我们需要做个演变就是将我们要执行的CommonExecute()函数用lambda表达式包裹为另一个函数的参数传递于是创建一个ExtraExecute() 函数1 public static void ExtraExecute(Action function)2 {3 try4 {5 Console.WriteLine(try here);6 function();7 }8 catch (Exception)9 {
10
11 throw;
12 }
13 }我们将包裹后的CommonExecute()作为入参传递给ExtraExecute()调用如下所示1 ExtraExecute(() CommonExecute(FirstMiddleware)); // 执行第一个中间件,先执行ExtraExecute() 再执行CommonExecute()
2 Console.WriteLine(-----------);
3 ExtraExecute(() CommonExecute(SecondMiddleware)); // 执行第二个中间件通过观察发现CommonExecute() 与ExtraExecute()方法签名一样所以我们可以调换下两者的执行顺序如下所示1 Console.WriteLine(-----------);
2 // 更改中间件调用顺序 先执行CommonExecute() 再执行ExtraExecute()
3 CommonExecute(() ExtraExecute(FirstMiddleware));带参创建中间件调用链我们刚刚演示了无参的中间件调用现在给中间件执行体增加入参新增FirstPipe(string msg, Actionfunc) SecondPipe(string msg, Actionfunc) ThirdPipe(string msg, Actionfunc) 三个函数如下调用,核心原则就是将中间件执行函数包裹成参数传递给下一个执行的函数1 Actionstring pipe (msg) ThirdPipe(msg,
2 (msg1) SecondPipe(msg1,
3 (msg2) FirstPipe(msg2, FirstMiddleware)));
4 pipe(Hello World); // 调用动态创建中间件管道模型从带参创建中间件调用链上我们发现我们无法把这个管道变成动态的那么如何才能将中间件动态传入以及动态改变调用顺序呢通过分析我发现一个管道执行的最基本单元可以像下面这样定义1 public abstract class DynamicPipeBase2 {3 protected readonly Actionstring _action;45 public DynamicPipeBase(Actionstring action)6 {7 this._action action;8 }9 public abstract void Handle(string msg); // 调用执行中间件函数体
10 }然后定义三个函数继承 DynamicPipeBase()1 /// summary2 /// 第三个中间件3 /// /summary4 public class ThirdSelfPipe : DynamicPipeBase5 {6 public ThirdSelfPipe(Actionstring action):base(action)7 {89 }
10 public override void Handle(string msg)
11 {
12 Console.WriteLine(Third Pipe Begin executing);
13 _action(msg);
14 Console.WriteLine(Third Pipe End executed);
15 }
16 }
17
18 public class SecondSelfPipe : DynamicPipeBase
19 {
20 public SecondSelfPipe(Actionstring action) : base(action)
21 {
22
23 }
24 public override void Handle(string msg)
25 {
26 Console.WriteLine(Second Pipe Begin executing);
27 _action(msg);
28 Console.WriteLine(Second Pipe End executed);
29 }
30 }
31
32 /// summary
33 /// 第一个中间件
34 /// /summary
35 public class FirstSelfPipe : DynamicPipeBase
36 {
37 public FirstSelfPipe(Actionstring action) : base(action)
38 {
39
40 }
41 public override void Handle(string msg)
42 {
43 Console.WriteLine(First Pipe Begin executing);
44 _action(msg);
45 Console.WriteLine(First Pipe End executed);
46 }
47 }有了中间件我们接着只需要构建管道即可如下所示1 /// summary2 /// 存储中间件: ListType _types;3 /// 生成中间件调用链: GeneratePipe4 /// 构建回调Build5 /// /summary6 public class PipeBuilder7 {8 protected readonly Actionstring _mainAction;9 ListType _types;
10 public PipeBuilder(Actionstring mainAction)
11 {
12 _mainAction mainAction;
13 _types new ListType();
14 }
15 public PipeBuilder AddPipe(Type type)
16 {
17 _types.Add(type);
18 return this;
19 }
20
21 private Actionstring GeneratePipe(int index)
22 {
23 if(index_types.Count-1)
24 {
25 var finalType (DynamicPipeBase)Activator.CreateInstance(_types[index], _mainAction);
26 return finalType.Handle;
27 }
28 else
29 {
30 var childHalde GeneratePipe(index 1);
31 return ((DynamicPipeBase)Activator.CreateInstance(_types[index], childHalde)).Handle;
32 }
33
34 }
35
36 public Actionstring Build()
37 {
38 return GeneratePipe(0);
39 }
40 }最终我们在上端调用1 #region 动态创建中间件管道模型
2 Actionstring pipeChain new PipeBuilder(MainAction)
3 .AddPipe(typeof(ThirdSelfPipe)) // 随意添加多个中间件执行单元
4 .AddPipe(typeof(SecondSelfPipe))
5 .AddPipe(typeof(FirstSelfPipe))
6 .Build();
7 pipeChain(Hello World);
8 Console.WriteLine(-------------);
9 #endregion这样便实现了文章开头展示的效果。【社区不定期分享.NET知识】记得点赞关注哦如需源码关注后台后添加小编微信即可~