我所处的项目中应该有一个Web界面和一个winforms界面。它可能会从WinForms开始,将来我们将添加一个ASP.NET MVC Web界面。
我有使用ASP.NET MVC和EF6的经验,但在阅读了如何将EF POCO实体绑定到https://msdn.microsoft.com/en-us/data/jj682076.aspx中的winforms控件之后,我意识到它需要修改实体定义(代码优先),暴露详细信息winforms implementationantion。
有没有办法从模型层隐藏winforms的依赖关系?
答案 0 :(得分:1)
我建议在描述的场景中,存储库代码由几个不同的前端项目使用,应该有一个公共中间层,用于从UI中抽象出数据库。
将winforms控件绑定到中间层对象。它根本不应该知道数据层。
答案 1 :(得分:1)
根据定义并考虑到您已经在使用MVC
和MVVM
,您应该记住,POCO
并非设计为绑定到视图(根本不是任何视图) 。 StackOverflow上有几个帖子甚至是问题,就像这两个:First | Second | (还有很多其他人)。
考虑到该声明,您应该设计一个ViewModel
,将POCO
映射到您的屏幕的有用项目(HTML
,Winforms
,原生移动或任何其他)并避免使用数据注释(将它们保持在最低限度)。
您可能需要两个ViewModel
个库,一个用于MVC
,另一个用于Winforms
,每个库都有自己的配置和所有,但由于它'更多关于数据传输而不是业务逻辑,这很好。
要以更好的(AKA:自动)方式将ViewModels
连接到POCO
,反之亦然,请仔细查看映射库,例如AutoMapper
或其他。我喜欢AutoMapper
因为有了它,我可以在不同的程序集中使用代码优先方法构建我的映射定义,保持一切真正干净并避免数据注释(我讨厌)。
答案 2 :(得分:0)
在一般情况下,获得通用实体模型不是问题。实际上,为了使导航属性在WinForms中可绑定,MS建议实现自动提供IBindingList集合的IListSource接口。但是,您可以将ObservableCollection类型用于适用于Web应用程序的导航属性,并在WinForms应用程序中使用IBindingList(如果使用MVVM模式,最好在视图模型中执行此类转换)。