繁体   English   中英

为简单的动态工作流系统建模(通过数据驱动的依赖注入?)

[英]Modeling a simple dynamic workflow system (via data-driven dependency injection?)

这更多的是架构问题,而不是请求代码帮助。 我想我想出了几种解决方案,但其中一些感到奇怪。 因此,我正在寻找任何形式的输入。

问题

请记住,以下情况纯属假设,仅用于简单说明情况。

假设我有一个非常简单的工作流系统,我希望可以通过XML文件对其进行配置。 为了使我们的假设示例简单,我们将此工作流程系统称为“向导”,它具有任意数量的步骤。 可能有三个步骤,但是它们可以按任意顺序排列并重复任意次数。

假设三个可能的向导步骤是:

  • 信息画面
  • 是/否选择屏幕
  • 选择路径屏幕

这三个屏幕将对应于三个类,所有这些类都继承自一个公共界面。 我们将这些定义如下:

public interface IWizardScreen {
    void Show();
}

public class InformationScreen : IWizardScreen, IDisposable {
    // Implementation
}

public class YesNoChoiceScreen : IWizardScreen, IDisposable {
    // Implementation
}

public class ChoosePathScreen : IWizardScreen, IDisposable {
    // Implementation
}

现在,我们的向导应用程序将使用这些类向最终用户显示一系列屏幕,这些屏幕存储在这样的列表或队列中:

public Queue<IWizardScreen> WorkflowScreens;

最后,这些向导屏幕( WorkflowScreens对象)的序列填充将由外部XML文件驱动,该文件可以由admin用户编辑。 该XML文件如下所示:

<workflow>
    <information-screen>
        <text>My first screen</text>
    </information-screen>
    <information-screen>
        <text>My second screen</text>
    </information-screen>
    <yesno-choice-screen var="mychoice">
        <text>My choice screen</text>
        <yes>2</yes>
        <no>1</no>
    </yesno-choice-screen>
    <choosepath-screen show-if="mychoice = '2'" />
    <information-screen show-if="mychoice = '1'>
        <text>My third screen</text>
    </information-screen>
</workflow>

需要以某种方式处理此XML文件,以达到与以下相同的结果:

public Queue<IWizardScreen> WorkflowScreens = new Queue<IWizardScreen>({
    new InformationScreen("My first screen"),
    new InformationScreen("My second screen"),
    new YesNoChoiceScreen("mychoice", "My choice screen", 2, 1),
    new ChoosePathScreen() { showIf = "mychoice = '2'" },
    new InformationScreen("My third screen") { showIf = "mychoice = '1'" }
});

同样,确切的规范和构造函数无关紧要,因为这只是一个纯假设的示例。 最后,我需要将XML文件转换为具有尽可能多的可扩展性的对象数组(理想情况下,从理论上讲,管理员用户只需将新的DLL迈出新的一步即可放入“ bin”文件夹中并添加一个新标签,并获得一个尽可能简单的新屏幕),并尽可能减少过度设计。 (为清楚起见,前面括号中的示例也仅用作示例,与该问题无关;不需要特定功能,而是展示了我希望的可扩展性)。

潜在的解决方案1:运行XSLT转换以馈入IoC容器

在这种情况下,这似乎是最自然的选择,但同时也感觉到过度设计和怪异。 基本上,XML文件将通过XSLT转换进行馈送,以为DI容器(城堡,Spring.NET等)创建XML配置文件,然后将其填充对象。

潜在的解决方案2:只需手动解析XML

这是最简单的方法,但也最不易扩展且“笨拙”,在这里我需要自己创建很多样板代码(用于解析XML,填充构造函数参数,甚至可能是一些本地DI来解析实际组件。 )。

潜在的解决方案3:询问Stackoverflow

我现在定居的那个:)

作为第三种选择(也是我已经使用过很多次),为什么不直接在IOC容器中编写工作流程。 诸如spring.net之类的东西,您需要使用它自己的XML来指定诸如向导配置之类的所有内容。 这将为您提供与您自己解析xml相同的结果,而无需重新发明轮子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM