EF 的 POCO vs POCO 更好的数据传输对象?

EF's POCO vs POCO better Data transfer Object?

我有一个场景,其中我有一些自定义实体在绑定到其 UI 的系统(桌面)中使用。我已转向 Entity framework 以获得它提供的好处,但由于自定义实体与系统紧密耦合,因此将继续使用自定义实体从 UI 获取数据。 现在,如果我想消除系统对这些自定义实体的依赖,比如我想从网络或任何其他平台使用我的服务,从设计角度来看我有哪些选择? 我认为要消除对自定义实体的依赖,我将不得不使用数据传输对象,比如 POCO。 那么我是应该使用 EF 为此提供的 POCO 实体还是单独编写它们? 是否有意义。我的方法应该是什么。

即使域对象实现为 POCO,它们仍然是域对象,不应该在不使用 DTO 的情况下转移到其他物理层。

认为 Entity Framework 实体是您的 POCO 样式域对象的代理,以便 - 例如 - 注入更改跟踪和延迟加载。此外,域对象可能包含比 UI.

的某些部分所需的更多数据

例如,您实现了一个包含 3 列的网格:姓名、第二个姓名和年龄。您将用户配置文件绑定到所谓的网格,但您的 Profile 域对象也有更多的属性,这将传输比您的 3 列网格所需的更多的数据!

这就是为什么您希望将您的域保留在您的域中,并且您的服务发出的数据将序列化 DTO 以涵盖您的实际 UI 用例,并且您不会通过wire,这可能会给您的组织增加额外的成本(通常您需要为托管环境中的网络使用付费),显然,序列化小对象的强度较低,不是吗?

一个干净的架构将有一个包含您的 POCO 对象的 class 库程序集(我们称之为 Common)。根据定义,POCO 对象是持久性无知的,不包含任何行为。它们只是代表您的实体。

在一个单独的程序集(我们称之为 DataAccess)中引用通用程序集并使用 DbContextEntityTypeConfiguration<T> classes 创建 EntityFramework 的映射。这显然意味着您不会使用任何 EDMX 文件,而是使用流畅的界面创建映射,无论如何这是使用 EF 的最佳方式。

此时,您在一个程序集中拥有可重用和解耦的对象,在另一个程序集中拥有您的数据访问逻辑和映射。

最重要的是,您可以抛出一个 IoC 容器来使事情更加解耦,但我认为这有点偏离主题。