【问题标题】:Working with WPF and Entity Framework together - what architecture? [closed]一起使用 WPF 和实体框架 - 什么架构? [关闭]
【发布时间】:2018-05-17 09:27:45
【问题描述】:

几个月来,我一直在使用 WPF MVVM 和实体框架编写应用程序,我意识到我的代码架构开始变得混乱。我似乎无法找到一种方法将 EF 和 WPF 正确连接在一起,同时保持两层不同且连贯的数据。

实体总是分离的,因为保持它们的连接意味着我们必须为整个应用程序保留一个 DbContext 实例,不推荐这样做。

目前,这是我的架构:

  • 大部分写入操作都放在从不占用的服务中 实体作为参数,只有它们的 ID。
  • ViewModel 调用服务,但由于未附加实体,因此未更新视图
  • ViewModel 直接从 DbContext 检索数据,根据需要显示的内容选择要包含的属性

问题:

  • 感觉不对。我觉得我没有正确使用 EF,这让我感到厌烦。
  • 我最终得到了很多具有未定义属性的实体实例(我不能总是包含所有这些,这会消耗太多内存)
  • 我的 ViewModel 中有 EF 代码

除了非常基本的教程之外,我似乎也无法在网上找到任何合适的 WPF - EF 架构示例。

例子:

class ViewModel : BaseViewModel
{
    private Service _service;

    public ViewModel(Service service)
    {
        LoadEntities();
    }

    public IList<Entity> Entities { get; set; }

    private void LoadEntities()
    {
        using(var context = new DbContext())
        {
            Entities = context.Entities
                .Include("Reference.Foo")
                .ToList();
        }
    }

    private void DeleteEntity(Entity entity)
    {
        _service.DeleteEntity(entity.Id);
        Entities.Remove(entity);
    }
}

【问题讨论】:

  • 所以你已经积累了几个月的问题。恭喜,但是关于查找教程的问题不在 StackOverflow 上。熟悉tour
  • 有很多相关的例子和教程。事实上,所有显示在 MVVM 架构中使用 ORM 的东西。从问题来看,您似乎不了解 MVVM 是什么或它是如何工作的:since the entities are not attached, the view is not updated 为什么您将 ViewModel 绑定到视图?这是他们的工作,而不是调用服务。 ViewModels retrieve their data directly from a DbContext:不,视图模型是从加载的数据(模型)创建的,并绑定到视图,从而强制自动更新
  • @Panagiotis Kanavos 对不起,我不擅长用英语解释事情。我添加了一个代码示例。虚拟机绑定了视图
  • @Romain 大多数课程和教程展示了如何从数据库加载数据。您的代码没有显示 INotifyPropertyChanged 的​​实现,但绑定不起作用。
  • @Romain 我建议您查看 Pluralsight 的 Building an Enterprise App with WPF, MVVM, and Entity Framework Code First 课程。您可以通过 Visual Studio Dev Essentials 计划获得 3 个月的免费访问权限

标签: c# wpf entity-framework


【解决方案1】:

这是一个非常“大”的问题......而且很难在一个简单的帖子上回答

为什么要关注 EF ?架构对所有人都是一样的......简单地说:实体;数据访问层;商业服务; GUI(视图、视图模型、服务 - 仅使用实体和服务)

您说“目前,这是我的架构” ==> 对我来说,这 3 点是错误的。将实体提供给服务不是问题,将实体附加到视图模型,不要直接在视图模型中调用 DB/EF,而是使用服务

  1. Assembly.Entities
  2. Assembly.BusinessServices
  3. Assembly.DAL
  4. Assembly.GUI

祝你好运

【讨论】:

  • 如果我对所有事情都使用该服务,我如何避免使用我需要的非常具体的方法使其臃肿?比如,对于给定的视图,我只需要某些我在其他视图中不需要的属性
  • @Romain 您的服务应该是一般的。他们应该是具体的。它们包含您的业务逻辑,这可能很复杂。
  • 这是一个非常“大”的问题 那么请以“太宽泛”投票结束。回答离题的问题会鼓励人们继续提问。
  • 然后你使用特定的 Viewmodel 和 getter;您的服务将有 GetAllCars 返回 CompleteCarViewModel 和另一个 GetAllCarsSimple 返回 SimpleCarViewModel ....确保它看起来“重复”但数据访问是相同的,只是转换不同 - 并且您将相同的模型 CarEntity 附加到您的视图模型
  • 看起来这很让我卡住了,我会让我的服务不那么通用,谢谢!我的上帝,有些人在这里很激进......
【解决方案2】:

一些提示:

  • 使用 IoC 容器来管理所有/大部分依赖项,包括 DbContext。这样你就可以更好地测试一切。然后,您可以配置这些依赖项的范围(单例、瞬态等)。一些流行的选项是 autofac、castle windsor、ninject 或来自 .net 的内置 ioc 容器。

  • 查看存储库模式,它将极大地解耦一切

  • 让您的 ViewModel 尽可能地笨拙

  • 将来自 EF 模型的数据映射到 DTO,不要直接在视图中使用实体

  • 了解 SOLID 原则

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多