如果我需要创建自定义类型,我不知道应该从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;
}
我返回的是什么类型的对象 - 数据访问对象或模型或数据传输对象或业务对象还是其他什么?
答案 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是特定的(如果适用)。