8

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

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

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

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

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

4

3 回答 3

9

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

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

STE 的主要优势(也是唯一优势)是它们的跟踪能力,但只有在双方都使用 STE 时,跟踪能力才有效:

  • 数据的客户端查询服务器
  • 服务器查询 EF 并接收一组 STE 并将它们返回给客户端
  • 客户端与 STE 一起工作,修改它们并将它们发送回服务器
  • 服务器接收 STE 并将传输的更改应用到 EF => 数据库

简而言之:客户端或服务器端没有其他模型。要充分使用 STE,它们必须:

  • 服务器端模型(= 没有单独的模型)
  • WCF 中传输的数据(= 无 DTO)
  • 客户端模型(= 没有单独的模型,直接绑定到 STE)。否则,在处理有界对象上的更改事件和修改 STE 时,您将重复跟踪逻辑。(客户端和服务器与 STE 共享程序集)。

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

你的其他要求呢?

  • 用户可以定义自己的接口,因此 WCF 服务所需的数据会根据用户为他们定义的接口而变化。

这应该是可能的,但要确保每个“延迟加载”部分都是单独的结构——不要在客户端构建复杂的模型。我已经看到人们不得不将整个实体图发回以进行更新的问题,这并不是您一直想要的。因此,我认为您不应该将加载的部分连接到单个实体图中。

  • 服务器端的权限检查会影响数据的返回方式。例如,某些数据根据用户的角色被部分或完全屏蔽

我不确定您希望如何实际实现这一目标。STE 不使用投影,因此您必须直接在实体中为空字段。请注意,当实体未处于跟踪状态时,您必须执行此操作,否则您的掩码将保存到数据库中。

  • 数据库层向多个服务器/数据库发送垃圾邮件

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

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

于 2011-03-28T19:12:48.397 回答
4

您可以为给定的场景选择 STE,

  • 所有的 STE 都是 POCO,.Net 动态地向其添加一层以进行更改跟踪。
  • 使用 T4 模板生成 STE,这将节省您的时间。
  • 使用 Automapper 等工具将节省您 手动将 WCF 返回的数据合同转换为实体或 DTO的时间

STE 的优点 -

  1. 您不必手动跟踪更改。
  2. 在 WCF 的情况下,您只需要说 applydbchanges,它就会自动刷新实体

STE 的缺点 -

  1. 由于动态跟踪,STE 比 POCO 重

POCO 的优点 -

  1. 轻的
  2. 可以很容易地与 EF 或 nH 桥接

POCO 的缺点 -

  1. 需要用EF手动跟踪变化。(痛苦)
于 2011-03-25T19:47:12.953 回答
0

POCO 是动态代理的,在网络上表现不佳,请参阅这篇 MSDN 文章了解解决方法。所以可以制作它们,但 IMO 你最好选择 STE,因为我相信它们与 WPF/MVVM 开发非常吻合。

于 2011-03-28T18:13:42.833 回答