2011-01-14 150 views
5

我想写一个BLL和DAL之间有非常严格界限的小应用程序,现在想知道通过数据(域传输对象)之间传递数据的最佳方式层。如何在UI,BLL和DAL之间使用DTO

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

class CustomerData 
{ 
    // some data fields 
} 

然后,我实现了一些班BLL为:

class Customer : CustomerData 
{ 
    // Some methods 
} 

在我DAL我通过的LINQ到SQL从数据库中获取客户记录。然后,我通过LINQ对象映射到我的域对象:

CustomerData.field = LinqObject.field 
// Etc 

我的想法是这样,我现在从我DAL到BLL一个CustomerData实例请求时(和我应该通过一个客户实例,以我的UI)。

在我的BLL中,我将因此收到一个CustomerData实例,但现在我想让它成为一个Customer。

问题:

  1. 我必须在我的BLL现在创建一个客户实例,并再次复制所有字段成员?
    客户c =新客户; c.field = CustomerData.field;
  2. 如何在不使用字段复制步骤的情况下从CustomerData创建客户?
  3. 我应该宁愿用组合吗?
    class Customer Customer Data Data; }
  4. 有没有一种更有效的方法(少编码等)来做到这一点在我目前的布局?
  5. 有没有更好的方法来做到这一点?
  6. 任何意见一般吗?

谢谢!

+0

尤拉的答案+8为#1。像这样的猴子编码可能对你来说看起来很痛苦。最终实际上是错误的做法,因为它增加了错误的程度,并使得事情在$$中变得如此痛苦。尝试ValuInjector - 许多人喜欢它比AutoMapper更好,更轻量。不要重复使用你的映射。 – FastAl 2013-10-02 01:59:16

回答

8

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

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

这种方式如果有一个字段需要存在于用户界面中但不在其他层中,DTO可以继承。

0

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

,也没有必要从CustomerData

编辑继承Customer: 我用这个词完全在这里,因为CustomerData是DTO,因此,而不是老顾客,返回CustomerData因为它是你的DTO作为见于以下图。

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

DTO 1]

+0

我将如何“充分使用”DTO's? – Oliver 2011-01-17 07:47:58

+0

@Oliver更新了答案。 – Adeel 2011-01-17 10:30:30

2

从我的角度来看的一些注意事项说到这里,我不是一个预言,但希望它会给予一定的帮助:)

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

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

对于较大的项目,特别是在分布式场景中,我使用自定义DTO作为UI层。这些类反映了UI的需求,并且可能与概念模型中的实体有很大不同。我个人认为Entity Framework 4在根据这种结构构建应用程序时可以为您提供很多帮助,如果您处于项目的早期阶段并使用.NET 4,则可能需要检查它吗?

  1. 是的,你可能需要。
  2. 使用组成
  3. 是的,我会用组成
  4. 例如使用实体框架4
  5. ( - “ - )
  6. 见上
1

如果你坚持在具有数层DTO,您可以使用AutoMapper来帮助您在一行代码中将其从一个转换为另一个(通过在DTO中使用相同的约定)。

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

你也应该看看PresentationModel模式:http://martinfowler.com/eaaDev/PresentationModel.html

你也可以谷歌MVVM(模型 - 视图 - 视图模型),如果你想要走这条路。

相关问题