数据传输对象,业务对象,域对象还是其他什么?

时间:2014-06-28 19:20:10

标签: asp.net asp.net-mvc dto

在数据库中我有表: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);
}

2 个答案:

答案 0 :(得分:2)

既然它既没有暴露任何行为(属性或getter / setter也没有资格),也没有封装它的结构(同样,属性或getter / setter什么也不做,只是暴露底层数据不合格)根本不是对象。

无论您使用的语言是否将其称为对象。它只是一个数据结构(如果您只想将数据从一个地方(如数据库)移动到另一个地方(如UI),那就非常好了。)

或者引用Dan North

  

数据传输对象是矛盾的

答案 1 :(得分:1)

  

此类数据传输对象,业务对象,域对象还是   什么?

DTO通常是一个主要用于在层或某种类型的边界之间传输数据的类。通常只是一个没有行为的对象。

我一直将域对象称为直接映射到数据库表的东西。因此,在您的示例中,您的域模型将为NotesComments

我会认为您的NotesWithComments对象是dto,或者可能是视图模型(因为您将它用作视图的asp.net mvc模型)。

我通常在这里使用的做法是使用你的NotesWithComments作为dto(传输数据,没有行为,很容易序列化,非常干净等),并创建另一个类作为你的视图模型。

一开始这些类可能非常相似,可能是相同的。但是如果你随着时间的推移做出改变,或者你的视图需要显示不同的东西,你只需更改视图模型,并从其他dtos填充它,或根据需要转换您的数据。然后,您还可以删除视图模型中您的视图不需要的属性..(除非您的视图神奇地直接映射到当前dto上的每个属性)。这是一个更多的工作,但如果你正在做一个长寿的项目,我想你会很高兴你以后做了。

因此,您将在数据层中使用EF填充域模型,然后使用dto将数据传输到Biz层,在那里需要,然后使用你的dto(可能是同一个)将您的数据传输到您的表示层(mvc),并从您收到的dtos填充您的视图模型。

无论如何,这是我对它的看法。