2014-01-21 29 views
1

我正在尋找一種方法來獲得一個C#類,主要運行沒有任何類型的圖形用戶界面作爲Windows服務的一部分,以可選地顯示在WPF畫布控件上。C#類與可選的GUI?

我最初的想法是讓對象擴展一個WPF控件,但是這需要服務器端(Windows服務)引用這些庫,這並不理想。我的第二個想法是實現一個工廠模式,其中一個包裝器將爲該對象生成一個GUI,但是如果需要,我希望該對象能夠定義它自己的設計(理想情況下帶有代碼隱藏的XAML)。

這些類通過MEF從插件目錄加載,並基於基於XML的設置文件實例化。

只有兩個獨立類的可能性也超出了我的想法,但這似乎增加了插件製作過程的複雜性和冗餘性(可能會有幾個)。

想法?

編輯:類可以被認爲是Windows工作流基礎活動。它們通過GUI進行配置並在服務器上運行。

+4

您應該將您的用戶界面與業務邏輯分開。有一個類對某些數據執行業務邏輯,另一類創建一個UI來表示在另一個類(或多個類)中執行的業務邏輯。 – Servy

+1

數據及其呈現方式應該是兩個單獨的事情。 –

+0

這正是我想要做的,但我不知道如何在這種特殊情況下有效地完成此操作,因爲它不是真正的切割和乾式MVVM類型的設置。 –

回答

6

將類本身的「業務邏輯」從它的任何GUI中分離出來。 GUI應該只是業務邏輯之上的一個視圖(可能與交互)。

作爲一個例子,我最近做了一個關於「Skeetris」的演示文稿 - 這是一個可能讓某些人看起來很熟悉的攔截遊戲。我有幾個項目的解決方案:

兩個項目,其一切引用:

  • Skeetris.Common(比特實際上沒有具體到Skeetris - 他們通常會去在一個實用程序庫在一般的命名空間)
  • Skeetris.Model(所有實際行爲 - 滴和旋轉形狀等)

客戶項目:

  • Skeetris.Text(基於控制檯的版本)
  • Skeetris.Wpf
  • Skeetris.WindowsStore
  • Skeetris.Email
  • Skeetris.Twitter

而且檢測項目:

  • Skeetris.Model.Test(測試模型)
  • Skeetris.Model.Testing(內部訪問Skeetris.Model,設計了一個項目,使其更容易測試兩個模型,並使用模型中的任何代碼)

正如你可以看到,有一個寬這裏有各種各樣的客戶 - 但他們沒有一個真正「理解」Skeetris;只有模型項目。 UI層儘可能薄,將更多邏輯放入更容易測試的模型類中。

這類設置的聽起來像是爲您的項目太多的理想人選:

  • 「核心」業務邏輯項目
  • Windows服務適配器項目(用代碼來對服務響應事件)
  • 一個WPF項目
  • 測試項目,當然:)
+0

「俄羅斯方塊」適合那些不太喜歡用文字/喬恩的姓氏進行創意遊戲的人:) –

+1

@SimonWhitehead:你可以這麼說。我不想引用商標;) –

+0

因此,您建議我的每個類都以兩種單獨的插件的形式出現,一種用於表示層,另一種用於業務邏輯層?沒有深入細節,我正在處理與Windows Workflow Foundation非常相似的事情,即通過GUI配置活動並在服務器上運行。 –

1

4sak3n0ne的,

對於這種要求,最好的方案是使用最少3個項目來實現這個結果。您將擁有以下項目系統層次結構。

  • MyApp.Logic < - 這是您的common類庫的創建位置。
  • MyApp.Service < - 這是您的Windows服務庫。
  • MyApp.GUI < - 這是您的WPF GUI項目。

現在給出的項目層次(可能更多,比這先進的),那麼我將引用MyApp.Logic到兩個MyApp.ServiceMyApp.GUI項目。

而仍然使用相同的代碼庫,這給你的邏輯之間的前端GUI和窗戶清晰的分離,服務。這也使得它更容易理解你的解決方案的每個部分是什麼,並允許重複使用相同的邏輯代碼庫。

乾杯。