【发布时间】:2020-05-05 18:01:50
【问题描述】:
我有一个媒体项目代表每个项目可以有多个来自不同用户的书签和 cmets。
当我来更新存储库时,我需要获取所有现有的评论和书签并附加新的 cmets 和书签,代码可以工作,但我想不出一种干净的方法来通用地执行此操作,这将减少重复,随着更多这样的领域的计划
public class MapValues
{
private readonly string _userName;
private readonly Media _media;
private readonly IMediaRepository _mediaRepo;
public MapValues(string userName, Media media, IMediaRepository mediaRepo)
{
_userName = userName;
_media = media;
IMediaRepository = mediaRepo;
}
public async Task<Media> AppendExistingUserValues(Media updatedMedia, string userName)
{
var existingMedia = await _mediaRepo.GetByIdAsync(updatedMedia.Id);
var existingBookmarks = GetBookmarksExcludingUser(userName, existingMedia);
var existingComments = GetCommentsExcludingUser(userName, existingMedia);
if (updatedMedia.Bookmarks.Any())
{
existingBookmarks.AddRange(updatedMedia.Bookmarks);
}
if (updatedMedia.Comments.Any())
{
existingComments.AddRange(updatedMedia.Comments);
}
updatedMedia.Bookmarks = existingBookmarks;
updatedMedia.Comments = existingComments;
return updatedMedia;
}
private List<MediaBookmarks> GetBookmarksExcludingUser(string userName, Media media)
{
var exisitingBookmarks = new List<MediaBookmarks>();
if (media?.Bookmarks != null)
{
exisitingBookmarks.AddRange(media.Bookmarks
.Where(x => !string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase)).ToList());
}
return exisitingBookmarks;
}
private List<MediaComments> GetCommentsExcludingUser(string userName, Media media)
{
var exisitingComments = new List<MediaComments>();
if (media?.Bookmarks != null)
{
exisitingComments.AddRange(media.Comments
.Where(x => !string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase)).ToList());
}
return exisitingComments;
}
}
public class Media
{
public IEnumerable<MediaBookmarks> Bookmarks { get; set; }
public IEnumerable<MediaComments> Comments { get; set; }
public string Id { get; set; }
}
public class MediaBookmarks
{
public string Name { get; set; }
}
public class MediaComments
{
public string Name { get; set; }
}
【问题讨论】:
-
你在说哪个重复?
-
@PavelAnikhouski 我认为他不喜欢重复的书签和 cmets
-
@FilipCordas 可以轻松内联成一行方法调用
-
@PavelAnikhouski 看起来不需要这样做。并且只想将新项目添加到 I Enumerable
标签: c# oop design-patterns