2009-10-15 69 views
3

我參與了一個能夠實時連接到不同硬件設備的項目。我們已經被分配製作一個觸摸屏GUI,所以我們有一個MMI到設備。由於任何設備(以及任何類型的設備)都可能連接到我們的框架,因此我們決定讓第三方設備開發人員製作他們自己的GUI插件。所有這一切都很好,現在到此爲止:)WPF GUI插件設計。我需要一個小小的反饋

真正的問題是,我們的經理希望這些圖形用戶界面能夠執行某些形式的控制流程,並且他不想讓我們擁有自己的DSL--因此,我們在WPF中執行GUI,他們必須能夠執行MSIL。這是一個巨大的安全威脅,我告訴他,但是因爲它是一個原型,所以他說沒問題。好吧,很好。
雖然有另一個問題 - 任意MSIL可能會崩潰或死鎖,所以我們需要在某種異步上下文中託管它。由於WPF不允許多個線程訪問圖形用戶界面,所以我們已經爲自己設置了一個複雜的場景..

到目前爲止,我對如何解決這個問題的想法相當缺乏見解。我最好的選擇是將GUI部分和代碼部分分成兩部分:用於GUI的Raw Xaml以及用於代碼的另一個線程中託管的MSIL。然後,我需要創建一個Facade(運行時?),通過向其他線程發送調用來將GUI和MSIL鏈接在一起。
我可以做到這一點,不是問題,但我認爲它真的很臭。您迫使其他開發人員無需使用代碼就可以使用MVVM,我不確定是否可以支持所有綁定,並且我不喜歡View和ViewModel在單獨的線程中(嗯,我不介意,但我不確定它是否會導致問題,因爲這個設計對於插件開發人員來說是非常透明的,所以他不會考慮讓東東線程安全)。

有沒有人有任何想法如何設計呢?還是對需求的想法?任何形式的反饋都會很好。

回答

0

我會嘗試給你一個不同的答案。不幸的是我不認爲你會有一個簡單的時間。它確實很有趣:)

  • 通過使用您控制的某種應用程序啓動代碼將您的插件託管在單獨的應用程序中。
  • 使用此機制建立安全你想要的方式(禁止訪問文件系統,網絡等)
  • 使用WCF與通信本地計算機的二進制模式。無論如何,你會提供某種API,所以這可能不會增加你所做的任何開銷。
  • 將插件放在沒有邊框的窗口中,並手動將其放置在主應用程序窗口中。 (我曾經在一個項目中工作,我們在一些項目中使用了幾個Office應用程序,它可以非常好地工作),您可能會花最多的時間來完成這項工作。但是一些小黑客會感覺自己像英雄一樣! :)
  • 請在DLL級別的一些資源共享(UI剝皮,外觀和感覺,共同控制和什麼,而不是)
+0

謝謝你的意見。我和我的一位朋友進行了一些冗長的討論,發現了這個問題和O/S在運行代碼時遇到的問題之間的很多相似之處。除非我們比微軟,Apple或整個* Nix社區更聰明,否則沒有解決方案。甚至沒有理由在異步環境中運行所有東西:)最好的辦法是在插件加載到GUI之前驗證,測試和簽名插件。 那麼,這是我們的結論:)我會接受這個答案,因爲它提供了最好的反饋:) – cwap 2009-10-16 12:45:53

0

這裏可能有一條中間道路 - 你的老闆不希望你創建自己的DSL,但是像IronPython/IronRuby這樣的現有動態語言怎麼樣?

不知道這是否會給你靈活性,你正在尋找,但它值得研究。我同意允許注入MSIL是hacky。我不確定將你的Views和ViewModel分離成單獨的線程是否可以工作,乾脆沒有工作。

+0

已經提出,但顯然這是一個不走的:S – cwap 2009-10-15 18:52:52

+0

..和是的,我不確定我是否可以在分離的情況下充分發揮作用。我覺得我在這裏死了:( – cwap 2009-10-15 18:53:25

1

如果你想這樣做'正確';看看在不同的應用程序域中託管插件。從託管應用程序設置這些應用程序域的安全級別並與定義明確的通道進行通信。

如果你想完成它;使用MEF。沒有什麼比插件架構的模式更勝一籌。

希望這會有所幫助,祝你好運!

+0

感謝您的輸入:)已經使用MEF,這真棒!但真正的問題是,WPF不允許除擁有者調度程序之外的其他線程訪問GUI,因此需要以某種方式橋接通信。 – cwap 2009-10-15 19:35:26

+0

這很糟糕。我感到你的痛苦 – 2009-10-15 19:36:55