Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用DTO';在UI、BLL和DAL之间_C#_User Interface_Dns_Data Access Layer_Bll - Fatal编程技术网

C# 如何使用DTO';在UI、BLL和DAL之间

C# 如何使用DTO';在UI、BLL和DAL之间,c#,user-interface,dns,data-access-layer,bll,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中,

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

我在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实例(并且我应该将一个Customer实例传递给我的UI)

在我的BLL中,我将因此收到一个CustomerData实例,但现在我想从中创建一个客户

问题:

  • 我现在是否必须在BLL中创建一个客户实例并再次复制所有字段成员?
    客户c=新客户; c、 字段=CustomerData.field
  • 在没有字段复制步骤的情况下,如何从CustomerData创建客户
  • 我应该用作文吗?
    类客户 { 客户数据; }
  • 在我当前的布局中有没有更有效的方法(减少编码等)
  • 有更好的方法吗
  • 有什么评论吗

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

    您没有完全使用DTO。在
    Customer
    类中,将
    CustomerData
    直接返回到您的UI

    而且不需要从
    CustomerData

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

    有一个建议,你应该用它来隔离你的BLL和DAL


    1]

    我的观点是,我不是甲骨文,但希望它能提供一些帮助:)

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

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

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

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

  • 是的,你可能需要
  • 使用构图
  • 是的,我会用作文
  • 例如,使用实体框架4
  • (-)
  • 见上文

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

    CustomerData CustomerData=Mapper.Map(linqObjectInstance);
    
    您还应该查看PresentationModel模式:


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

    肯定会查看EF4。我最初的结论是,这个应用程序的层太多了。但过去我的层总是“泄漏”太多,所以我在这里试图对自己严格要求。我如何“充分利用”“DTO’s?有人给了我一篇文章,其中有一个很好的例子,说明了DTO和BLL和DAL之间的相互作用不是贫血领域模型反模式。meYorah对1的回答是+8,这令人困惑。猴子那样编码对你来说可能是一种痛苦。最后,这实际上是错误的做法,因为它增加了bug的程度,使事情在a$$中变得如此痛苦。试试看,很多人喜欢它比AutoMapper好,更轻。请务必重复使用映射。
    CustomerData customerData = Mapper.Map<LinqObject, CustomerData>(linqObjectInstance);