加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 04:34:23 所属栏目:asp.Net 来源:网络整理
导读:我有以下域模型: public class Playlist{ public long Id { get; set; } public string Title { get; set; } public virtual ICollectionSong Songs { get; set; }}public class Song{ public long Id { get; set; } public string Name { get; set; } publ
我有以下域模型:
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.

非常感谢任何输入.

解决方法

DTO不是数据的平面表示,尽管它们可以.

这就是它们的美妙之处 – 您可以根据需要构建它们,而不是数据库如何定义事物.它们也是从行为中分离数据的一种手段.

我根本不会在DTO中引用Domain对象. (你在构造函数中有它)使用工厂来构建DTO,这样你的客户只需要引用DTO而不是Domain对象.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读