2016-07-22 95 views
0

我在一個項目中應該有一個web界面以及一個winforms界面。它可能會從WinForms開始,未來我們將添加一個ASP.NET MVC Web界面。我知道如何將EF POCO實體綁定到https://msdn.microsoft.com/en-us/data/jj682076.aspx中的winforms控件,我意識到它需要修改實體定義(代碼第一),暴露winforms實現的細節。EF模型與winforms和asp.net的綁定

有沒有什麼辦法從模型層隱藏winforms的依賴關係?

回答

1

根據定義,並且考慮到您已經在使用MVCMVVM,您應該記住POCO不適合與視圖(任何視圖)綁定。有幾個帖子,甚至在StackOverflow上的問題,就像這兩個:First | Second | (和許多其他)。

考慮這種說法,你應該設計一個ViewModel將映射你的POCO到你的屏幕有用的物品(或HTMLWinforms,本地移動或任何其他),並避免使用數據的註釋(他們保持到最低金額)。

可能需要兩個ViewModel庫,一個爲MVC,另一個用於Winforms,每個都有它自己的CONFIGS和所有,但因爲它更多的是數據傳輸和少談業務邏輯,這是相當好的。

若要將ViewModels更改爲POCO,反之亦然(更好(AKA:自動)),請仔細查看映射庫,如AutoMapper或其他。我喜歡AutoMapper,因爲有了它,我可以在不同的程序集中使用代碼優先的方法構建我的映射定義,保持一切真正乾淨並避免數據註釋(我討厭)。

+0

我將採用在WinForms ViewModel庫中放置'''''ObservableCollection''和MVC ViewModel庫的普通舊式列表的方法。 –

1

我會建議在所描述的場景中,數據庫代碼被幾個不同的前端項目使用,應該有一個公共中間層從UI抽象數據庫。

將winforms控件綁定到中間圖層對象。它根本不知道數據層。

+0

你是指DTO或ViewModels的一層嗎?所以任何服務層都應該返回ViewModels而不是實體框架模型l,不是嗎? –

+0

UI應該使用ViewModels。中/業務/服務層應該基於實體來處理模型。至少這是我發現導致最少量的混淆和最大限度的重複使用。 – IntoNET

0

在常見情況下,獲得通用實體模型並不是問題。事實上,爲了使導航屬性可以在WinForms中綁定,MS建議實現自動提供IBindingList集合的IListSource接口。但是,您可以使用適用於Web應用程序的導航屬性的ObservableCollection類型,並在WinForms應用程序中使用IBindingList(如果您使用MVVM模式,最好在視圖模型中執行此類轉換)。