65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Unity 配置文件在 ASP.NET 中构建工作流管理器

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (2投票s)

2018 年 4 月 10 日

CPOL

3分钟阅读

viewsIcon

10873

downloadIcon

83

本文解释了一种设计方法,该方法涉及使用配置文件和 Unity 框架设置流程的工作流。它有助于仅通过更新配置文件来更改流程,而无需进行其他代码更改。

引言

本文涉及一种设计模式,该模式有助于以一种使更改工作流变得非常容易的方式编写代码。通常,有不同的方法可以动态更新流程,例如使用数据库,但本文解释了使用 Unity 框架和配置文件。更改流程并部署到生产环境通常涉及代码更改并重新测试所有内容,因为我们部署的是整个软件包或只有一个 DLL。但是,将流程放在配置文件中并使用 Unity 框架来实现它,可以让你在流程中具有灵活性,而无需进行任何代码更改。

背景

在阅读本文之前,最好先参考 Microsoft Unity如何在 ASP.NET MVC 框架中使用 Unity 容器 这两篇文章,以便更好地理解 Unity 的工作方式以及它如何解决我们的大部分问题,使生活更轻松。另外,请阅读 Unity 配置架构 链接,了解不同的 Unity 标签和架构细节。

业务需求

我有一个业务需求,期望是让工作流实现尽可能松散耦合,即当我们希望更改工作流时,应该只需要最少的代码更改。这种方法的目的是以这样一种方式进行设置,即配置文件中的一个小更改就应该反映出新的工作流,而无需进行任何代码更改。由于部署配置文件非常简单,因此它提供了切换流程以及在出现问题时快速回滚到原始工作流的机会。

Using the Code

在开始编码之前,我们需要从 NuGet Package Manager 获取 Unity Framework Package。要获取软件包,请转到 工具 -> NuGet Package Manager -> 管理解决方案的 NuGet 软件包。

对于演示,我正在使用一个简单的控制台应用程序项目类型。我有四个任务/步骤,它们实现了一个单一的接口 ITask

我们已经使用 Unity 在配置文件中注册了所有这些对象。

注意:我已经编写了这些对象并以这种方式注册了它,我们可以使用相同的方法创建新的工作流或进行更新。因此,在某些时候,我希望创建一个新的工作流,我所需要做的就是在 Unity 配置中创建一个新的注册,其中包含相应的步骤,我们就可以开始使用了。

现在是时候看看这段代码的实际应用了。

            IUnityContainer container = new UnityContainer();
            container.LoadConfiguration();

            Console.WriteLine("Executing basic workflow...");
            IWorkFlowManager workFlowManager = container.Resolve<IWorkFlowManager>("BasicWorkflow");
            workFlowManager.Execute();

            Console.WriteLine("Executing Advanced workflow...");
            workFlowManager = container.Resolve<IWorkFlowManager>("AdvancedWorkflow");
            workFlowManager.Execute();

在这里,当我使用名称为“BasicWorkflow”解析我的 IWorkFlowManager 工作流时,它会返回具有按顺序排列的任务的对象,然后执行它。在示例中,我们在工作流 "BasicWorkFlow" 中有四个任务,当我们执行它时,所有四个任务都会被执行。

如果将来,我计划更改我的工作流步骤/任务,并且不再需要使用 TaskB,我所要做的就是更新配置文件并将其从 "BasicWorkFlow" Register 标签中删除,然后你的流程就更新了。就这么简单。

我还有另一个 "AdvanceWorkflow",它使用相同的步骤,但在 Unity 配置中使用了不同的注册。我们更改属性值,它就成为了一个具有相同业务逻辑的全新对象(可以根据我们的需求进行更改)。

关注点

这项练习的最好之处在于,我意识到当我们切换到配置文件实现时,Unity 可以被广泛使用。这种设计模式可以与任何创建型、结构型或行为型设计模式集成。尽管它给代码增加了一点复杂性,但一旦掌握了它,就可以帮助使代码模块化且耦合度更低。如果正确实现,你可以像即插即用一样进行功能切换。

© . All rights reserved.