我有以下域模型:
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; } }
我的服务有以下代码:
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,添加到结果对象并传递回控制器.代码如下:
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对象运行良好,但最近引入的匹配使事情变得复杂一些.看起来我别无选择,只能修改我的SongDTO以考虑匹配,看起来像这样:
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.
非常感谢任何输入.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。