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

时间:2015-01-06 16:28:14

标签: c# .net architecture dependency-injection workflow

这更像是一个架构问题而不是代码帮助请求。我想我想出了几个解决方案,但有些人觉得很奇怪。因此,我正在寻找任何形式的投入。

问题

请记住,下面的场景纯属假设,旨在简单说明情况。

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

让我们说三个可能的向导步骤是:

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

这三个屏幕将对应三个类,所有类都继承自通用接口。我们将如下定义:

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文件驱动,可由管理员用户编辑。此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放入&#39; bin&#39;文件夹并添加一个新标签,并获得一个简单的新屏幕)并尽可能少地进行过度工程设计。 (为了澄清,前面括号中的示例也仅仅用作示例,与此问题无关;不需要特定功能,但展示了我更喜欢的可扩展性程度。)

潜在解决方案1:运行XSLT转换以提供给IoC容器

在这种情况下,这个似乎是最自然的,但也感觉非常过度设计和奇怪。基本上,XML文件将通过XSLT转换提供,为DI容器(Castle,Spring.NET,等等)创建XML配置文件,然后填充对象。

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

这个感觉最简单,但也是最不易扩展的,而且很笨拙,我需要自己创建很多样板代码(用于解析XML,填充构造函数参数,甚至可能是某些家庭 - 用于分辨实际组件的DI。

潜在解决方案3:询问Stackoverflow

我现在定居的那个人:)

1 个答案:

答案 0 :(得分:1)

作为第三种选择(我已多次使用),为什么不直接在IOC容器中编写工作流。像spring.net这样的东西,你可以使用它自己的XML来指定类似你的向导配置。这将为您提供与自己解析xml相同的结果,而无需重新发明轮子。