5

我正在尝试编写一个在 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 实例,但现在我想从中创建一个 Customer。

问题:

  1. 我现在是否必须在我的 BLL 中创建一个客户实例并再次复制所有字段成员?
    客户 c = 新客户;c.field = CustomerData.field;
  2. 如何在没有字段复制步骤的情况下从 CustomerData 创建客户?
  3. 我应该而不是使用 composition 吗?
    类客户 { 客户数据数据;}
  4. 在我当前的布局中是否有更有效的方法(更少的编码等)来做到这一点?
  5. 有没有更好的方法来做到这一点?
  6. 一般有什么意见吗?

谢谢 !

4

4 回答 4

8

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

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

这样,如果有一个字段需要在 UI 中存在但不在其他层中,则可以继承 DTO。

于 2011-01-14T12:26:51.327 回答
2

从我的角度来看,这里有一些注释,我不是神谕,但希望它能提供一些帮助:)

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

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

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

就个人而言,我认为 Entity Framework 4 在根据这种结构构建应用程序时对您有很大帮助,如果您处于项目的早期阶段并使用 .NET 4,您可能想检查一下吗?

  1. 是的,你可能需要。
  2. 使用组合
  3. 是的,我会使用组合
  4. 例如使用实体框架 4
  5. (-"-)
  6. 看上面
于 2011-01-14T13:08:02.350 回答
1

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

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

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

如果你想这样做,你也可以谷歌搜索 MVVM (Model-View-ViewModel)。

于 2011-01-14T13:58:16.837 回答
0

您没有完全使用 DTO 的 . 在您的Customer班级中,CustomerData直接返回您的 UI。

并且不需要继承CustomerCustomerData

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

一个建议是,您应该使用存储库模式来隔离您的 BLL 和 DAL。

DTO1]

于 2011-01-14T13:00:18.347 回答