DTO在三层实体框架应用程序中

时间:2013-02-10 20:58:31

标签: c# entity-framework architecture dto

我正在构建两个C#三层应用程序,这些应用程序将数据作为一个非常旧的数据库Customer表,其中包含大约100列。它们在业务层中执行一些逻辑,表示层显示数据。

客户表的布局是 -

CustomerID
Firstname
Lastname
DateOfBirth
Othervalue1
Othervalue2
Othervalue3
.
.
Othervalue95
Creationdate
Updatedate

对于这两个应用程序,我只需要customer表,但我正在使用Entity Framework构建一个新的数据访问层。未来的项目需要访问其他表,并将添加到此访问层。

我将使用工作单元和存储库模式。

我的问题如下 -

应用程序A 需要客户表列的一个子集

应用程序B 需要客户表列的不同子集(与应用程序A的需求有一些重叠)

如何执行从数据层到这两个独立业务层的映射?我知道我可以使用automapper来执行从数据实体类到业务层类的映射,但是我将有两个不同的业务层Customer类。

我一直在阅读有关DTO的内容,但我不知道这个n层应用程序应该去哪里。

4 个答案:

答案 0 :(得分:3)

您可以根据您的应用程序设计使用其中任何一种 1 - 将客户表映射到两个或更多实体
2 - 拥有像CustomerBase这样的基本实体和2个或更多子实体。
3 - DTO是数据传输对象,它们(通常)是可变的。更改它们不会导致DB上的CRUD操作。
DTO用于以下场景:客户实体是重量级对象(比如100列),您只需要该数据的子集(比如20列)。  DTO对象和实际实体之间的转换可以通过自动映射器,手动操作员开发等多种方式实现......

希望这有帮助

答案 1 :(得分:1)

继承人我会做什么:

在应用程序A中 - 提取您需要的数据,并将它们映射到新类(DTO) 对应用程序B执行相同的操作。

如果这两个应用程序没有其他关系,那么除了共享数据库之外,你应该什么都不做。即:保持应用程序A不存在应用程序B的存在,反之亦然。

DTO只是您在n层应用程序中共享的对象的一个​​奇特名称。

答案 2 :(得分:1)

您可以使用IOC并将相关的映射器注入数据层。

您是否需要使用UoW和存储库模式? EF是一种数据访问抽象,具有自己的工作单元。您可以在业务层中访问DBContext,并使用Linq将数据投影到DTO中。

答案 3 :(得分:1)

您是否需要旧版系统的只读访问权限?

在这种情况下,我建议在每个应用程序和两个不同的实体框架模型上使用Anti Corruption Layer pattern,您只能映射所需的列。

如果你还需要写它可能很困难,你必须映射所有列。

如果要使用单个实体框架模型,则可以使用dtos映射数据子集。在这种情况下,自动映射器可以是一个很好的解决方案。