如何在UI,BLL,DAL之间使用DTO

时间:2011-01-14 12:18:35

标签: c# user-interface dns data-access-layer bll

我正在尝试编写一个在BLL和DAL之间有非常严格的边界的小应用程序,现在我想知道在层之间传递数据(域传输对象)的最佳方法是什么。

我在BLL和DAL访问的域级(类库)中实现了一些类。这些类基本上只包含属性/数据成员,并且当前反映了DAL数据。例如:

class CustomerData
{
  // some data fields
}

然后我在BLL中实现了一些类:

class Customer : CustomerData
{
  // Some methods
}

在我的DAL中,我通过Linq-to-Sql从数据库中获取客户记录。然后我通过以下方式将linq对象映射到我的Domain对象:

CustomerData.field = LinqObject.field
// Etc

因此我的想法是,我现在是一个CustomerData实例,从我的DAL到BLL(如果被请求)(我应该将一个Customer实例传递给我的UI)。

在我的BLL中,我将收到一个CustomerData实例,但现在我想让客户摆脱它。

问题:

  1. 我现在必须在我的BLL中创建一个Customer实例并重新复制所有字段成员吗?  客户c =新客户;  c.field = CustomerData.field;
  2. 如何在没有字段复制步骤的情况下从CustomerData创建客户?
  3. 我是否应该使用作文? 班级客户 {  客户数据; }
  4. 在我目前的布局中,是否有更有效的方法(减少编码等)?
  5. 有更好的方法吗?
  6. 一般意见何处?
  7. 谢谢!

4 个答案:

答案 0 :(得分:8)

通常我认为DTO是非特定于层的,由DAL创建/使用,由BLL处理并由UI使用/创建。

通常每个图层都是VS解决方案文件夹中的一个单独项目,因此DTO是另一个由每个图层引用的项目。

这样,如果某个字段需要存在于UI中而不存在于其他图层中,则可以继承DTO。

答案 1 :(得分:2)

我的观点中的一些注释来到这里,我不是一个神谕,但希望它会给予一些帮助:)

对我而言,你觉得这里有太多的“模特”。它可能会导致混淆并导致大量代码只是为了在不同的表示之间复制数据。许多代码意味着更多的错误。然后,我认为在定义业务类时,数据类和业务类之间的继承限制了您。如果要创建由多个数据类组成的业务类,该怎么办?您应该使用我认为的接口或组合。

通常,我只使用一个反映业务领域的概念模型。正如Dead Rabit指出的那样,这个模型既被数据和业务层使用,在某些情况下甚至是表示层(在较小的应用程序中)。为了坚持不懈,我使用的是O / RM,例如EF 4。

对于较大的项目,特别是在分布式场景中,我使用自定义DTO作为UI层。这些类反映了UI的需求,并且可能与概念模型中的实体有很大不同。

就个人而言,我认为实体框架4在根据这种结构构建应用程序时会给你很多帮助,如果你处于项目的早期阶段并使用.NET 4,你可能想要查看它吗?

  1. 是的,你可能需要。
  2. 使用构图
  3. 是的,我会使用作文
  4. 使用例如Entity Framework 4
  5. ( - “ - )
  6. 见上文

答案 2 :(得分:1)

如果您坚持在DTO上使用多个图层,则可以使用AutoMapper帮助您在一行代码中从一个图层转换为另一个图层(通过在DTO中使用相同的约定)。

CustomerData customerData = Mapper.Map<LinqObject, CustomerData>(linqObjectInstance);

您还应该查看PresentationModel模式:http://martinfowler.com/eaaDev/PresentationModel.html

如果你想这样做,你也可以google for MVVM(Model-View-ViewModel)。

答案 3 :(得分:0)

你没有完全使用DTO。在Customer课程中,将CustomerData直接返回到您的用户界面。

并且无需从Customer

继承CustomerData

编辑: 我在这里使用了完全一词,因为CustomerData是DTO,因此不是返回Customer,而是返回CustomerData,因为它是您的DTO,如下图所示。

一个建议是,您应该使用Repository Pattern来隔离您的BLL和DAL。

DTO 1]