我在一個項目中應該有一個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的依賴關係?
我在一個項目中應該有一個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的依賴關係?
根據定義,並且考慮到您已經在使用MVC
和MVVM
,您應該記住POCO
不適合與視圖(任何視圖)綁定。有幾個帖子,甚至在StackOverflow上的問題,就像這兩個:First | Second | (和許多其他)。
考慮這種說法,你應該設計一個ViewModel
將映射你的POCO
到你的屏幕有用的物品(或HTML
,Winforms
,本地移動或任何其他),並避免使用數據的註釋(他們保持到最低金額)。
可能需要兩個ViewModel
庫,一個爲MVC
,另一個用於Winforms
,每個都有它自己的CONFIGS和所有,但因爲它更多的是數據傳輸和少談業務邏輯,這是相當好的。
若要將ViewModels
更改爲POCO
,反之亦然(更好(AKA:自動)),請仔細查看映射庫,如AutoMapper
或其他。我喜歡AutoMapper
,因爲有了它,我可以在不同的程序集中使用代碼優先的方法構建我的映射定義,保持一切真正乾淨並避免數據註釋(我討厭)。
我會建議在所描述的場景中,數據庫代碼被幾個不同的前端項目使用,應該有一個公共中間層從UI抽象數據庫。
將winforms控件綁定到中間圖層對象。它根本不知道數據層。
你是指DTO或ViewModels的一層嗎?所以任何服務層都應該返回ViewModels而不是實體框架模型l,不是嗎? –
UI應該使用ViewModels。中/業務/服務層應該基於實體來處理模型。至少這是我發現導致最少量的混淆和最大限度的重複使用。 – IntoNET
在常見情況下,獲得通用實體模型並不是問題。事實上,爲了使導航屬性可以在WinForms中綁定,MS建議實現自動提供IBindingList集合的IListSource接口。但是,您可以使用適用於Web應用程序的導航屬性的ObservableCollection類型,並在WinForms應用程序中使用IBindingList(如果您使用MVVM模式,最好在視圖模型中執行此類轉換)。
我將採用在WinForms ViewModel庫中放置'''''ObservableCollection''和MVC ViewModel庫的普通舊式列表的方法。 –