2016-07-22 72 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模式,最好在视图模型中执行此类转换)。