gpt4 book ai didi

asp.net-mvc-3 - DTO 可以嵌套 DTO 吗?

转载 作者:行者123 更新时间:2023-12-02 00:39:58 25 4
gpt4 key购买 nike

我有以下域模型:

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,添加到结果对象并传回 Controller 。代码如下:

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,并将域模型直接传递给 Controller ​​,然后就到此为止了。但我不想这样做,因为整个目的是学习如何使用 DTO。

非常感谢您的任何意见。

最佳答案

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

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

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

 Song mySong;
SongDTO = DTOFactory.GetSong(mySong);

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

关于asp.net-mvc-3 - DTO 可以嵌套 DTO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com