【问题标题】:EF model-binding with winforms and asp.netEF 模型与 winforms 和 asp.net 的绑定
【发布时间】:2016-07-22 13:31:34
【问题描述】:

我在一个项目中应该有一个 web 界面以及一个 winforms 界面。它可能会从 WinForms 开始,未来我们将添加一个 ASP.NET MVC Web 界面。

我有使用 ASP.NET MVC 和 EF6 的经验,但是在阅读了 https://msdn.microsoft.com/en-us/data/jj682076.aspx 中的如何将 EF POCO 实体绑定到 winforms 控件之后,我意识到它需要修改实体定义(代码优先),以公开 winforms 实现的详细信息.

有没有什么方法可以从模型层隐藏winforms的依赖关系?

【问题讨论】:

    标签: c# asp.net winforms entity-framework


    【解决方案1】:

    根据定义并考虑到您已经在使用MVCMVVM,您应该记住POCO 并非旨在绑定到视图(任何视图)。 StackOverflow 上有几个帖子,甚至还有问题,就像这两个:First | Second | (以及许多其他人)。

    考虑到该声明,您应该设计一个 ViewModel 将您的 POCO 映射到屏幕上的有用项目(HTMLWinforms、本机移动或任何其他)并避免使用数据注释(保持到最低限度)。

    您可能需要两个ViewModel 库,一个用于MVC,另一个用于Winforms,每个库都有自己的配置,但由于它更多的是关于数据传输而不是关于业务逻辑,所以这很很好。

    要将ViewModels 连接到POCO,反之亦然,请仔细查看映射库,如AutoMapper 或其他一些。我喜欢AutoMapper,因为有了它,我可以在不同的程序集中使用代码优先的方法来构建我的映射定义,保持一切都非常干净并避免数据注释(我讨厌)。

    【讨论】:

    • 我将采取将ObservableCollection 放入 WinForms ViewModel 库和 MVC ViewModel 库的普通列表的方法。
    【解决方案2】:

    我建议在所描述的场景中,存储库代码被多个不同的前端项目使用,应该有一个通用的中间层从 UI 中抽象出数据库。

    将您的 winforms 控件绑定到中间层对象。它应该完全不了解数据层。

    【讨论】:

    • 你指的是一层DTO还是ViewModel?所以任何服务层都应该返回 ViewModels 而不是实体框架模型,不是吗?
    • UI 应该使用 ViewModels。 Middle/Business/Service 层应该处理基于实体的模型。至少我发现这会导致最少的混乱和最大的重复使用。
    【解决方案3】:

    一般情况下,获取通用实体模型是没有问题的。实际上,为了使导航属性在 WinForms 中可绑定,MS 建议实现自动提供 IBindingList 集合的 IListSource 接口。但是,您可以将 ObservableCollection 类型用于适合 Web 应用程序的导航属性,并在 WinForms 应用程序中使用 IBindingList(如果您使用 MVVM 模式,最好在视图模型中执行此类转换)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2014-01-19
      • 2011-01-28
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多