wcf - 我怎么知道我应该使用 self 跟踪实体还是 DTO/POCO?

标签 wcf entity-framework-4 poco self-tracking-entities n-tier-architecture

关于我们的设计,我可以问自己哪些问题,以确定我们是否应该在应用程序中使用 DTO 或自我跟踪实体?

以下是我知道要考虑的一些事情:

  • 我们有一个带有 WPF/MVVM 客户端、WCF 服务器和 MS SQL 数据库的标准 n 层应用程序。
  • 用户可以定义自己的接口(interface),因此 WCF 服务所需的数据会根据用户为自己定义的接口(interface)而变化
  • 模型在客户端和服务器端都用于验证。我们不会直接绑定(bind)到 DTO 或 STE
  • 如果需要,某些模型包含从 WCF 服务延迟加载的属性
  • 数据库层向多个服务器/数据库发送垃圾邮件
  • 服务器端的权限检查会影响数据的返回方式。例如,根据用户的角色
  • 部分或完全屏蔽了某些数据
  • 我们的资源有限(时间、人力等)

  • 那么,我怎样才能确定什么是适合我们的呢?我以前从未使用过 EF,所以我真的不知道 STE 是否适合我们。

    我看到人们建议从 STE 开始,并且只在问题出现时才实现 DTO,但是我们目前已经有了 DTO,并且正在尝试确定使用 STE 是否会让生活更轻松。我们在这个过程中已经足够早了,切换不会花费太长时间,但我不想切换到 STE 只是发现它对我们不起作用并且必须将所有东西都切换回来。

    最佳答案

    如果我了解您的架构,我认为这对 STEs 不利因为:

  • 模型在客户端和服务器端都用于验证。我们不会直接绑定(bind)到 DTO 或 STE

  • STE 的主要优势(也是唯一优势)是它们的跟踪能力,但只有在双方都使用 STE 时,跟踪能力才有效:
  • 数据的客户端查询服务器
  • 服务器查询 EF 并接收一组 STE 并将它们返回给客户端
  • 客户端使用 STE,修改它们并将它们发送回服务器
  • 服务器接收 STE 并将传输的更改应用到 EF => 数据库

  • 简而言之:客户端或服务器端没有其他模型。要充分使用 STE,它们必须:
  • 服务器端模型(= 没有单独的模型)
  • WCF 中传输的数据(= 无 DTO)
  • 客户端模型(= 没有单独的模型,直接绑定(bind)到 STE)。否则,在处理有界对象上的更改事件和修改 STE 时,您将重复跟踪逻辑。 (客户端和服务器与 STE 共享程序集)。

  • 任何其他情况仅仅意味着您没有利用自我跟踪能力,也不需要它们。

    你的其他要求呢?
  • 用户可以定义自己的接口(interface),因此 WCF 服务所需的数据会根据用户为他们定义的接口(interface)而变化。

  • 这应该是可能的,但要确保每个“延迟加载”部分都是单独的结构——不要在客户端构建复杂的模型。我已经看到人们不得不将整个实体图发回以进行更新的问题,这并不是您一直想要的。因此,我认为您不应该将加载的部分连接到单个实体图中。
  • 服务器端的权限检查会影响数据的返回方式。例如,根据用户的角色
  • 部分或完全屏蔽了某些数据

    我不确定您希望如何实际实现这一目标。 STE 不使用投影,因此您必须直接在实体中为空字段。请注意,您必须在实体未处于跟踪状态时执行此操作,否则您的掩码将保存到数据库中。
  • 数据库层向多个服务器/数据库发送垃圾邮件

  • 这不是 STE 的问题。服务器必须使用正确的 EF 上下文来加载和保存数据。

    STE是变更集模式的实现。如果您想使用它们,您应该遵循它们的规则以充分利用该模式。如果使用得当,它们可以节省一些时间,但这种速度的提升伴随着一些架构决策的牺牲。与任何其他技术一样,它们并不完美,有时您会发现它们很难使用(只需关注 self-tracking-entities 标签即可查看问题)。他们也有一些serious disadvantages但在 .NET WPF 客户端中,您不会遇到它们。

    关于wcf - 我怎么知道我应该使用 self 跟踪实体还是 DTO/POCO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5407673/

    相关文章:

    asp.net-mvc-3 - 我如何使用System.ComponentModel.DataAnnotations.AssociationAttribute

    c# - DTO 加上 UnitOfWork 模式是为 Web 应用程序设计 DAL 的好方法吗?

    entity-framework - 带有可为空参数的 Entity Framework 和存储过程函数导入

    c# - Linq 与 Lambda 等效于 SQL

    c# - POCO/Domain 对象是否可以注入(inject)依赖项

    c# - WCF 客户端/服务器配置不匹配

    WCF 最大待处理接受: Default value 0

    ajax - 使用 Ajax 将 JSON 发送到 WCF 3.5

    .net - 为什么 WsHttpbindings 给出错误为 "soap header action was not understood"而不是 basichttpbinding?

    c# - 附加具有关联的实体以进行修改