利用Asp.Net Core的MiddleWare思想如何处理复杂业务流
这篇文章主要介绍了如何利用Asp.Net Core的Middleware思想来处理复杂业务流程。通过示例代码和生动的描述,让读者对Middleware思想有了更深入的理解。
在古老的公司代码中,处理复杂业务流程往往涉及到大量的if或switch判断,使得代码结构混乱,难以维护。而利用Asp.Net Core的Middleware思想,可以将这些复杂的业务流程封装成一个个中间件,并通过管道模型进行有序处理。
背景介绍中,提到了流程初始化接口需要根据传入的流程类型做不同的工作,有的工作是共有的,有的则是某一流程特有的。这些处理工作可以分为前期准备、处理中和扫尾三个阶段。而Middleware正是为了更好地处理这些工作而诞生的。
在Middleware的思想中,每一个Middleware都是一个Func,它肩负起了调用下一个Middleware(委托)的重任。这些Func集合在一起,就形成了管道(Pipeline)。当一个请求(Request)进入管道后,会按照顺序依次经过每一个Middleware进行处理,直到最后一个Middleware完成处理,返回响应(Response)。
这种管道模型可以很好地处理复杂业务流程。我们可以根据业务流程的不同阶段,将不同的处理逻辑封装成不同的Middleware,并通过管道模型进行有序处理。这样,不仅可以提高代码的可读性和可维护性,还可以更好地处理各种异常情况。
文章还结合代码进行了详细解读,让读者更加深入地了解Middleware的实现原理。通过示例代码,介绍了如何定义Middleware、如何将其添加到管道中、以及如何传递上下文(Context)等信息。
新型管道构建策略:为业务处理注入活力
在软件开发领域,管道构建模式正逐渐成为处理业务逻辑的强大工具。近日,我对该模式进行了深入并做出了一些改进。我将为你详细介绍如何构建一个灵活的管道,并如何利用它来优化业务处理流程。
让我们关注一个核心功能:添加一个函数到管道中。这个功能可以通过下面的方法实现:
```csharp
public IPipeLineBuilder
{
_ponents.Add(func);
return this;
}
```
在此基础上,我们进行了一次重载,使得使用更加灵活:
```csharp
public IPipeLineBuilder
{
// 创建委托链接,将action和下一个middleware结合起来
Func
context =>
{
action.Invoke(context);
return next.Invoke(context);
};
if (index.HasValue)
if (index.Value > _ponents.Count)
else
_ponents.Insert(index.Value, pipleDelegate);
else
_ponents.Add(pipleDelegate);
return this; // 返回当前实例以保持链式调用
}
```
这个重载版本允许你直接传入一个业务处理动作`Action
```csharp
public PipeLineDelegate
{
var requestDelegate = (PipeLineDelegate
foreach (var func in _ponents.Reverse())
requestDelegate = func(requestDelegate);
return requestDelegate;
}
```
我们定义了三个管道构建器:beforePipeLineBuilder、handlingPipeLineBuilder 和 afterPipeLineBuilder,它们分别用于构建审批流程前的预处理、处理中以及处理后的管道。这些构建器通过调用 InitBeforePipeLine、InitHandlingPipeLine 以及 InitAfterPipeLine 方法进行初始化。
接下来,我们根据传入的 context.flowType 来动态注册实体管道(RegisterEntityPipeLine)。这个方法的工作机制是根据流程类型找到对应的类。这些类继承了一个公共的接口,该接口暴露出了 Handle 方法。
在 RegisterEntityPipeLine 方法中,首先根据 flowType 构建类名(前缀加上 flowType),然后在当前应用程序域(AppDomain)的所有程序集中查找含有这个类名的类。如果找到了匹配的类,就实例化这个类,并调用其 Handle 方法。Handle 方法是这些管道处理的核心,它负责执行前后管道的构建和调用。
具体地,Handle 方法内部会接收三个管道构建器作为参数,并根据这些构建器创建实际的管道(beforePipeLine、handlingPipeLine 和 afterPipeLine)。之后,它会依次调用这些管道的 Invoke 方法,将 context 作为参数传入,从而启动审批流程的预处理、处理和后续动作。
如果未能找到对应的类,RegisterEntityPipeLine 方法将抛出 ObjectNotFoundException。这个异常表明系统未能找到名称为 [handleClassName] 的类,即未能找到对应的处理流程。
InitApproveFlow 方法通过动态加载和注册实体管道,实现了审批流程的灵活配置和高效执行。而 Handle 方法则是管道处理的核心,负责具体的业务逻辑处理。这样的设计使得软件能够适应不同的审批流程需求,提高了软件的扩展性和可维护性。在管道构建的世界中,我们不仅要搭建桥梁,更要精心编织流程。想象一下,我们正在处理一个名为ApproveFlow的审批流程,它包含三个主要阶段:前处理、处理中、后处理。每个阶段都有其独特的任务和责任,它们通过我们的管道构建器被精心安排。
我们的Handle方法接受三个管道构建器作为参数,它们分别对应ApproveFlow的初始化上下文:beforePipeLineBuilder(预处理管道),handlingPipeLineBuilder(处理中管道)和afterPipeLineBuilder(后处理管道)。
想象一下,如果我们在执行任务时,某个任务需要前一个任务的结果作为输入怎么办?别担心,我们的管道设计中有一个叫做TContext的对象,你可以在其中添加属性来存储上游任务的结果。这样,下游任务就可以轻松获取并使用这些结果。这就像一条流水线上的工人,他们通过共享某些信息来协同工作。
而为了确保管道的通用性,使其不受特定业务的限制,我们可以使用泛型TContext。为每个任务创建一个对应的TContext,这样不同的业务就可以复用同一个管道。这就像搭建一个通用的流水线,不论产品如何变化,流水线的基本结构保持不变。
我们构建的管道系统既灵活又强大。无论是协同工作还是优先处理任务,无论是特定业务还是通用流程,我们的管道系统都能应对自如。现在,让我们用Cambrian.render('body')将这个精彩的管道世界渲染出来,展现给所有人看吧!狼蚁SEO团队始终在这里支持大家,如果有任何疑问或建议,请随时与我们交流。让我们一起创造更美好的明天!
网络安全培训
- 利用Asp.Net Core的MiddleWare思想如何处理复杂业务流
- vue.js 左侧二级菜单显示与隐藏切换的实例代码
- Asp.net中使用DapperExtensions和反射来实现一个通用搜
- PHP foreach遍历多维数组实现方式
- Django+Vue实现WebSocket连接的示例代码
- 浅谈String.valueOf()方法的使用
- linux下多个mysql5.7.19(tar.gz)安装图文教程
- Vue 仿QQ左滑删除组件功能
- 如何编写高质量JS代码(续)
- JS中获取 DOM 元素的绝对位置实例详解
- 微信小程序 实战小程序实例
- PHP 获取视频时长的实例代码
- [整理版]ASP常用内置函数
- node.js平台下利用cookie实现记住密码登陆(Expres
- jquery实现页面百叶窗走马灯式翻滚显示效果的方
- Vue实现typeahead组件功能(非常靠谱)