存储库继承重构

时间:2016-06-28 14:26:48

标签: c# linq oop design-patterns repository-pattern

我有两个存储库(PostRepository和AlbumRepository),并且都从另一个PublicationRepository继承。

在PostRepository中我有这些预测

return queryBase.Select(x => new NewsFeed
                             {
                                 Id = x.PublicationID,
                                 Title = x.Title,
                                 Content = x.Content,
                                 CreatedDate = x.CreatedDate,
                                 Link = x.Link,
                                 Type = NewsFeedType.Post,
                                 PostType = x.PostType,
                                 OwnerId = x.UserID.HasValue ? x.UserID.Value : 0,
                                 OwnerFirstName = x.User != null ? x.User.FirstName : "",
                                 OwnerLastName = x.User != null ? x.User.LastName : "",
                                 OwnerProfilePicture = x.User != null ? x.User.PhotoPath : "",
                                 CommentsCount = x.PublicationComment.Count(),
                                 ILike = x.Consultation.Any(c => c.ViewedByID == userId && c.ILike == true && c.DeletedFlag != true),
                                 IsSignaled = x.Consultation.Any(c => c.ViewedByID == userId && c.IsSignaled == true && c.DeletedFlag != true),
                                 RecommendationCount = x.Consultation.Count(c => c.DeletedFlag != true && c.ILike == true),
                                 TargetPopulations = x.Access.Select(a => a.Population.PopulationName).ToList(),
                                 OwnerIsMyManager = promoManagerIds.Contains(x.UserID)
                             });

在AlbumRepository中我有这些

return queryBase.Select(x => new NewsFeed
                             {
                                 Id = x.PublicationID,
                                 Title = x.AlbumName,
                                 CreatedDate = x.CreatedDate,
                                 Type = NewsFeedType.Album,
                                 OwnerId = x.UserID.HasValue ? x.UserID.Value : 0,
                                 OwnerFirstName = x.User != null ? x.User.FirstName : "",
                                 OwnerLastName = x.User != null ? x.User.LastName : "",
                                 OwnerProfilePicture = x.User != null ? x.User.PhotoPath : "",
                                 CommentsCount = x.PublicationComment.Count(),
                                 ILike = x.Consultation.Any(c => c.ViewedByID == userId && c.ILike == true && c.DeletedFlag != true),
                                 IsSignaled = x.Consultation.Any(c => c.ViewedByID == userId && c.IsSignaled == true && c.DeletedFlag != true),
                                 RecommendationCount = x.Consultation.Count(c => c.DeletedFlag != true && c.ILike == true),
                                 TargetPopulations = x.Access.Select(a => a.Population.PopulationName).ToList(),
                                 AlbumPhotoPaths = x.AlbumPhoto.Where(a => a.DeletedFlag != true).Select(a => a.AlbumElementPath).ToList()
                             });

正如您所看到的,这里有很多重复的代码。有没有办法将所有常见的投影移动到基础存储库中,只保留特定存储库中的特定投影?

1 个答案:

答案 0 :(得分:1)

请考虑以下结构:

public class PublicationRepository
{
    string PublicationID;
    string Title;

    public virtual NewsFeed GetNewsFeed()
    {
        return new NewsFeed { Id = PublicationID, Title = Title };
    }
}

public class PostRepository : PublicationRepository
{
    string UserID;

    public virtual NewsFeed GetNewsFeed()
    {
        NewsFeed newsFeed = base.GetNewsFeed();
        newsFeed.OwnerIsMyManager = promoManagerIds.Contains(UserID);
        return newsFeed;
    }
}

public class AlbumRepository : PublicationRepository
{
    AlbumPhoto[] AlbumPhoto;

    public override NewsFeed GetNewsFeed()
    {
        NewsFeed newsFeed = base.GetNewsFeed();
        newsFeed.AlbumPhotoPath = AlbumPhoto.Where(...);
        return newsFeed;
    }
}

然后:

return queryBase.Select(x => x.GetNewsFeed());
相关问题