簡體   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