如果我需要创建自定义类型,我应该从DAL传递给BLL什么样的对象?

时间:2017-04-30 17:13:13

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

如果我需要创建自定义类型,我不知道应该从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,内容和评论数量哪些不是垃圾邮件,所以在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;
}

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

3 个答案:

答案 0 :(得分:1)

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

您可以使用DTO对象仅传输具有所需属性的数据。但请记住,您的viewpage需要一个模型类来绑定数据。因此,您必须使用sscanf或其他库将DTO映射到您的实体类。

希望这有帮助!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我发现您只关注WhatIsIt版本Note的{​​{1}},这将是您的DAL查询的结果。我对此有不同意见,即WhatIsIt不应该是DAL的一部分,因此从DAL返回给BLL。我马上回过头来看看。在此之前,让我们修改一些条款。

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

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

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

现在回到我之前提出的观点 - &#34; WhatIsIt不应该成为DAL的一部分,因此从DAL返回到BLL&#34;。对我来说WhatIsIt是一个DTO,一旦从DAL获回Entity对象就会由BLL创建(你已经在BLL中引用了DAL,所以这不应该是个问题)。然后BLL会将此DTO传递到表示层,ViewModel是特定的(如果适用)。