首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DTO可以嵌套DTO吗?

DTO可以嵌套DTO吗?
EN

Stack Overflow用户
提问于 2011-06-30 00:35:36
回答 2查看 6.2K关注 0票数 15

我有以下域模型:

代码语言:javascript
复制
public class Playlist
{
    public long Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Song> Songs { get; set; }
}

public class Song
{
    public long Id { get; set; }
    public string Name { get; set; }
    public virtual Playlist Playlist { get; set; }
    public virtual ICollection<Catalog> Matches { get; set; }
}

public class Catalog
{
    public long Id { get; set; }
    public string Title { get; set; }
}

我的服务有以下代码:

代码语言:javascript
复制
public PlaylistResult FindByPlaylistId(long id)
{
    Playlist playlist = playlistRepository.GetById(id);

    foreach (var song in playlist.Songs)
    {
        song.Matches = catalogRepository.GetMatches(song.Name).ToList();
    }

    return new PlaylistResult(new PlaylistDTO(playlist), playlist.Songs.Select(x => new SongDTO(x)));
}

我的服务从数据库中获取一个播放列表和歌曲,然后对播放列表中的每首歌曲执行一个查询,以便从数据库中获取特定于该歌曲的其他匹配项(使用SQL Server全文搜索)。

然后将数据转换为DTO,添加到结果对象中,并传递回控制器。代码如下所示:

代码语言:javascript
复制
public class PlaylistResult
{
    public PlaylistResult(PlaylistDTO playlist, IEnumerable<SongDTO> songs)
    {
        Playlist = playlist;
        Songs = songs;
    }

    public PlaylistDTO Playlist { get; private set; }

    public IEnumerable<SongDTO> Songs { get; private set; }
}

问题是:

到目前为止,PlaylistResult对象工作得很好,但是最近引入的matches使事情变得有点复杂。看起来我别无选择,只能修改我的SongDTO以考虑匹配情况,如下所示:

代码语言:javascript
复制
public class SongDTO
{
    public SongDTO(Song song, IEnumerable<CatalogDTO> matches)
    {
        Id = song.Id;
        Name = song.Name;
        Matches = matches;
    }

    public long Id { get; private set; }

    public string Name { get; private set; }

    public IEnumerable<CatalogDTO> Matches { get; private set; }
}

但是这不是违背了DTO的目的吗?据我所知,DTO是数据的扁平化表示,这种方法不是扁平化的。另一方面,我看不到其他方法,因为每一场比赛都是针对每首歌曲的。

我意识到,我可以让这件事变得更容易,抛出DTO,直接将域模型传递给控制器,然后调用它。但我不想这样做,因为整个目的是学习如何使用DTO。

我们非常感谢您的任何意见。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-30 00:44:07

DTO不是数据的扁平化表示,尽管它们可以是。

这就是它们的美妙之处--您可以根据需要构建它们,而不是像数据库那样定义事物。它们也是将数据从行为中分离出来的一种手段。

我根本不会在DTO中放置对域对象的引用。(在构造函数中)使用工厂来构建DTO,这样您的客户端只需要引用DTO而不是域对象。

代码语言:javascript
复制
 Song mySong;
 SongDTO = DTOFactory.GetSong(mySong);

如果您的客户需要引用Domain对象,那么他们也可以使用它们!

票数 13
EN

Stack Overflow用户

发布于 2011-06-30 17:07:27

你所做的是正确的。我认为,当您在应用程序的数据层之间传递数据时,它们本质上是扁平化的表示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6524121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档