2012-03-15 67 views
14

我可以使用哪種體系結構和模式來共享WPF和ASP.NET MVC應用程序之間最多的模型和邏輯代碼?如何共享WPF和ASP.NET MVC應用程序之間的大部分代碼?

我想在這裏實現一點,不僅僅是將兩個演示項目中的數據實體分開。還有很多常見的例如在什麼條件下顯示什麼,何時需要什麼等UI邏輯,我想保留在共享代碼中。

ADDED:我剛剛開始真正喜歡獨立於我的實體模型驅動我的演示文稿的視圖模型的概念。雖然這些註釋中使用的一些註釋位於特定於MVC的程序集中,但所提供的元數據實際上都不是Web特定的。我非常想探索使用我的MVC視圖模型作爲綁定到WPF視圖的數據源。任何建議在這方面將不勝感激。

+0

我問過類似的問題[這裏](https://stackoverflow.com/questions/44528570/should-viewmodel-deal-directly-with-dto-or-it-is-ok-to-have-intermediate-clientm )。你是否成功重用ViewModels? – Tenek 2017-06-15 14:45:00

回答

6

我個人最喜歡的配置是一個類似於亞當國王建議上面,但我喜歡保持邏輯DLL作爲Web項目的一部分。我運行一個名爲CT Terminal的項目,遵循這種模式。我的Terminal.Domain項目包含了所有的應用程序邏輯,並簡單地返回一個CommandResult對象,其中的屬性充當指令以告訴UI項目要做什麼。 UI是完全愚蠢的,只處理Domain項目告訴的內容。

現在,遵循Adam King的方法,然後我會將該域DLL放入WPF應用程序,然後編寫UI以遵循返回的CommandResult對象中的說明。但是,我更喜歡不同的方法。我編寫了MVC 3 UI以公開一個JSON API。這個API可以被任何應用程序使用。 JSON API很簡單,因爲它基本上是我的Terminal.Domain項目CommandResult對象的包裝。返回的JSON將具有相同的基本屬性。通過這種方式,我會編寫WPF應用程序來使用此API而不是DLL。現在,如果我對內部應用程序邏輯進行細微更改,那麼只需將Web項目部署到實時服務器。所有使用API​​的客戶端都會自動獲得這個新的邏輯。

顯然,如果所做的更改會影響從API返回的屬性,那麼需要釋放新的客戶端代碼,但至少對於內部邏輯來說,您不必這樣做。

+1

我有點像這種方法。它提供的不僅僅是在不同的演示項目之間共享數據實體。 – ProfK 2012-03-16 05:04:51

+0

「CT終端」鏈接不再起作用。 – Tenek 2017-06-15 14:33:48

+0

對不起,我不確定那個項目發生了什麼,但是這個概念被複制到一個名爲[霰彈槍](https://github.com/chevex-archived/shotgun)的新的node.js項目中。它不是一個類庫,而是一個節點模塊。 – Chev 2017-06-18 16:16:26

2

我其實發現了Rocky Lhotka的書籍,軟件和關於這個話題的視頻非常有幫助。這裏有幾個鏈接到他的內容:

http://www.lhotka.net/

http://channel9.msdn.com/Events/Speakers/Rockford-Lhotka

http://www.amazon.com/Expert-C-2008-Business-Objects/dp/1430210192/ref=sr_1_2?s=books&ie=UTF8&qid=1331834548&sr=1-2

+3

什麼具體適用於這裏問的問題? – 2012-03-15 19:03:10

+0

Rocky有一個適用於模型和視圖模型的.NET庫,效果很好。正如他的視頻中所解釋的,我認爲它的設計適用於非常可重用的代碼。他討論了WPF DependencyObject屬性模型,並在他的庫中實現了類似的東西。我認爲這是一個有用的功能,以MSMVC。 – Brannon 2012-04-05 13:29:40

+0

撇開:Lhotka的* Professional VB6 Business Objects *是我作爲獨立開發人員創立自己職業生涯的聖經。 – ProfK 2012-04-09 20:46:00

3

其中最廣泛使用的模式似乎有在一個單獨的DLL組件的實體,那麼這個引用有來自每個其他項目。

MVC 3套存儲庫模式非常漂亮,它可以是一個乾淨的路線可以在第一時間,並將爲WPF和ASP.net工作

1

通過使用代表所有需要執行的操作的方法指定接口來爲應用程序創建服務層。另外,在此服務層中,定義應用程序使用的所有數據類型。那些數據類型類應該只包含屬性,而不包含操作。將這些接口和類本身放在一個程序集中。該程序集應該在您的Web應用程序,WPF應用程序和實現它的代碼之間共享。

最後,一旦你有這種分離,您可以自由開發應用程序的內部結構,並留下UI操作的責任,相應的UI(當你點擊XYZ按鈕例如會發生什麼)。

順便說一句,你可以暴露你的服務層,通過WCF和Web服務。您可以使用它通過JavaScript從Web瀏覽器撥打電話。您可以執行諸如客戶端驗證之類的操作,甚至可以在下拉式操作系統中快速查找值。同時在兩個應用程序之間重用它。

1

從明顯開始。將業務邏輯和領域模型封裝在單獨的程序集中。

就表現層和共享UI行爲而言,最接近的是MVVM設計範例,實現將是WPF/XAML中的C#和ASP.NET MVC Web前端的Javascript。

對於web前端你可以親近做與http://knockoutjs.com/事情微軟的史蒂夫·桑德森書面的WPF(MVVM)的方式。它的MVVM爲瀏覽器。同時結賬http://www.asp.net/mvc/mvc4瞭解更多信息。

1

使用網絡API,讓無論是WPF和Web應用程序使用來自網絡API服務。 完成。

+0

我喜歡這種方法,它看起來如此簡單和優雅,但是如何將主要數據模型實體共享到WPF應用程序,特別是如果您想要使用數據註釋和屬性強制執行驗證和序列化?我是否必須爲每個平臺專門重新定義模型類?這似乎幾乎打敗使用的WebAPI的全部好處,因爲我必須保持模型同步不同的平臺... – SelAromDotNet 2012-11-27 05:33:07

1

你有沒有嘗試使用Portable class libraries。有了這個,你可以創建數據層,並在ASP.Net MVC,WPF,Windows Phone和Silverlight中使用它。

+0

可你(或其他人閱讀本)指向任何資源使用便攜式類庫來專門討論瞄準Web和Win8/WinPhone/WPF?我喜歡NPehrsson提出的使用WebAPI從網絡上向其他平臺提供的建議,並希望對我的評論有更多的瞭解。非常感謝! – SelAromDotNet 2012-11-27 05:31:27

相關問題