【问题标题】:What kind of object I should pass from DAL to BLL if I need to create custom type?如果我需要创建自定义类型,我应该将哪种对象从 DAL 传递到 BLL?
【发布时间】:2017-09-28 06:42:46
【问题描述】:

如果我需要创建自定义类型,我不知道应该将哪种对象从 DAL 传递到 BLL。
在 DAL 我有一个实体:

public class Note
{
    [Key]
    public int NoteId { get; set; }

    [Required]
    [Column(TypeName = "varchar(MAX)")]
    public string Content { get; set; }

    public DateTime CreatedDate { get; set; }

    public DateTime ModifiedDate { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

但我只需要返回 BLL:NoteId、Content 和 cmets 数量,它们不是垃圾邮件,所以在 DAL 中我有一个查询:

public IEnumerable<WhatIsIt> GetNotesWithNoSpamCommentsCount()
{
    var whatIsIt = context.Notes.Select(x =>
        new WhatIsIt
        {
            NoteId = x.NoteId,
            NoteSummary = x.Content,
            NoteCommentsCount = x.Comments.Where(y => y.IsSpam == false).Count() 
        }).ToList();

    return whatIsIt;
}

我返回的是什么类型的对象 - 是数据访问对象或模型还是数据传输对象或业务对象或其他对象?

【问题讨论】:

    标签: c# asp.net .net design-patterns architecture


    【解决方案1】:

    Model 和 DTO 可以不同。两者都用于不同的目的。在您的上下文中,我认为您应该创建一个新的 DTO(模型)对象,该对象将仅包含您需要从 DAL 发送到 BAL 的必填字段。它会更安全、更快,因为它会携带更少的数据。

    【讨论】:

      【解决方案2】:

      根据您编写的代码,它可能是您的 DTO(日期传输对象)。 我在这里假设Note 是您的实体类。因此,使用实体类在层之间传输数据并不是最佳实践。

      您只能使用 DTO 对象来传输具有所需属性的数据。但请再次记住,您的视图页面需要一个模型类来绑定数据。因此,您必须使用 AutoMapper 或其他库将您的 DTO 映射到您的实体类。

      希望这会有所帮助!

      【讨论】:

      • Note 是他的 DTO 不是吗?不是他的虚拟机?他的 VM 应该是一个只有 Id、Content 和 Comments 属性的新类?还是我错了?
      • 那么实体框架上下文中的DTO是什么?
      • @Mardoxx:共有三种不同的东西,实体类、ViewModeles 和 DTO。基本上,实体类包含表的定义并用于执行与数据库相关的事情。 Viewmodel 用于将数据绑定到视图。 DTO 用于传输数据。
      • @Mardoxx:如果有任何困惑,问这个问题是完全正确的,最后所有人都在这里学习。很高兴我能帮忙:)
      • @Div - Viewmodel 和 DTO 在 MVVM (WPF) 中是不同的,因为那里的 VM 有行为。在 MVC 中它们是相同的。在这种情况下,Note 绝不可能是 ViewModel。它纯粹是一个实体(我假设OP使用的是EF)。可能是您在回答中错误地这么说。
      【解决方案3】:

      我看到您只关心WhatIsIt,它是Note 的精简版,将是您的DAL 查询的结果。我对此有不同的看法,即WhatIsIt 不应该是其中的一部分,因此应该从 DAL 返回到 BLL。我稍后会回到这个问题。在此之前,让我们修改几个术语。

      域/业务对象 - 它们通常是相同的并且包含业务逻辑。

      域对象/DTO - 如果业务逻辑在域对象之外执行,那么该对象可以被认为是 DTO,它除了属性之外什么都没有,用于跨层传输数据。

      实体 vs DTO - 实体纯粹是数据模型的一部分,通常被 ORM 或数据访问层用于处理数据存储。

      现在回到我之前提出的观点 - “WhatIsIt 不应该是其中的一部分,因此应该从 DAL 返回到 BLL”。对我来说,WhatIsIt 是一个 DTO,一旦 BLL 从 DAL 取回 Entity 对象,就会创建它(你已经在 BLL 中引用了 DAL,所以这应该不是问题)。然后 BLL 会将这个 DTO 传递给表示层,具体来说是 ViewModel,如果适用的话。

      【讨论】:

      • 所以我应该将带有注释实体的注释实体的所有数据传递给 BLL,在 BLL 中我应该创建 DTO?这是个好主意吗?因为我只需要Notes的基本数据和Comments的数量。
      猜你喜欢
      • 1970-01-01
      • 2012-03-04
      • 2012-04-27
      • 2014-02-24
      • 2020-08-31
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多