在数据库中我有表:Notes和表注释。在我的解决方案中,我有3个项目:DAL,BLL和Web。
我需要向用户显示带有注释的注释,这些注释未设置为垃圾邮件,因此我在DAL项目中创建了该类:
public class NotesWithComments
{
public Notes Note { get; set; }
public IEnumerable<Comments> Comments { get; set; }
}
我在每个项目中使用上面的类:DAL,BLL和Web。这类数据传输对象,业务对象,域对象还是什么?
在存储库类中,我有这个查询:
public class NotesRepository
{
DatabaseContext context;
public NotesRepository(DatabaseContext context)
{
this.context = context;
}
public IQueryable<NotesWithComments> GetNotesWithNoSpamComments()
{
IQueryable<NotesWithComments> notesWithNoSpamComments = context.Notes.Include(x => x.Comments).OrderByDescending(x => x.CreateDate)
.Select(x => new NotesWithComments
{
Note = x,
Comments = x.Comments.Where(y => y.IsSpam == false).OrderBy(y => y.CreateDate)
});
return notesWithNoSpamComments;
}
}
在BLL项目中,我使用了存储库类中的方法:
public class NotesService
{
private readonly IUnitOfWork _unitOfWork;
public NotesService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public IEnumerable<NotesWithComments> GetNotesWithComments()
{
IQueryable<NotesWithComments> result = _unitOfWork.NotesRepository.GetNotesWithNoSpamComments();
return result;
}
}
在Web项目中,我使用服务类的方法:
public ActionResult Index()
{
List<NotesWithComments> result = _notesService.GetNotesWithComments();
return View(result);
}
答案 0 :(得分:2)
既然它既没有暴露任何行为(属性或getter / setter也没有资格),也没有封装它的结构(同样,属性或getter / setter什么也不做,只是暴露底层数据不合格)根本不是对象。
无论您使用的语言是否将其称为对象。它只是一个数据结构(如果您只想将数据从一个地方(如数据库)移动到另一个地方(如UI),那就非常好了。)
或者引用Dan North:
数据传输对象是矛盾的
答案 1 :(得分:1)
此类数据传输对象,业务对象,域对象还是 什么?
DTO通常是一个主要用于在层或某种类型的边界之间传输数据的类。通常只是一个没有行为的对象。
我一直将域对象称为直接映射到数据库表的东西。因此,在您的示例中,您的域模型将为Notes
和Comments
。
我会认为您的NotesWithComments
对象是dto,或者可能是视图模型(因为您将它用作视图的asp.net mvc模型)。
我通常在这里使用的做法是使用你的NotesWithComments
作为dto(传输数据,没有行为,很容易序列化,非常干净等),并创建另一个类作为你的视图模型。
一开始这些类可能非常相似,可能是相同的。但是如果你随着时间的推移做出改变,或者你的视图需要显示不同的东西,你只需更改视图模型,并从其他dtos填充它,或根据需要转换您的数据。然后,您还可以删除视图模型中您的视图不需要的属性..(除非您的视图神奇地直接映射到当前dto上的每个属性)。这是一个更多的工作,但如果你正在做一个长寿的项目,我想你会很高兴你以后做了。
因此,您将在数据层中使用EF填充域模型,然后使用dto将数据传输到Biz层,在那里需要,然后使用你的dto(可能是同一个)将您的数据传输到您的表示层(mvc),并从您收到的dtos填充您的视图模型。
无论如何,这是我对它的看法。