存储库模式 - 连接两个表中的数据

时间:2015-09-18 12:17:07

标签: .net asp.net-mvc asp.net-mvc-5 repository-pattern data-transfer-objects

我在我的CommentService中使用了两个存储库。

_commentRepository
_userRepository

使用_commentRepository.GetAll()函数我获得了所有评论的列表,其中包含以下信息:[Id],[Content],[UserId]。

我尝试创建一个列表,其中包含_userRepository可以获取的所有注释和一些匹配的用户信息,并将其存储在DTO中。

public ListOutput<CommentUserDto> GetCommentsWithUserInformation()
{
    var comments = _commentRepository.GetAll();

    // TODO: Add comment and user information to CommentUserDto.

    return new ListOutput<CommentUserDto>
    {
        Items = Mapper.Map<List<CommentUserDto>>(comments)
    };
}

我该如何做到这一点?

我发现了一些可能的想法:

  1. 创建_commentUserRepository
  2. 使用include以某种方式加入两个表(我使用E.F。)
  3. 在我的域层中创建一个管理器,用于组合逻辑。
  4. 编辑:

    评论模型:

    public class Comment
    {
        public virtual string Content { get; set; }
        public virtual DateTime CreationTime { get; set; }
        public virtual long UserId { get; set; } // Id of User that posted Comment (always filled in)
    }
    

    用户模型:

    public class User {
        public virtual string Name { get; set; }
        public virtual string Surname { get; set; }
        public virtual string Email { get; set; }  
        public virtual string Password { get; set; }
    }
    

    CommentUserDto://视图的可访问类

    public class CommentUserDto {
        public string Content { get; set; } // from comment
        public DateTime CreationTime { get; set; } // from comment
        public string PosterName { get; set; } // from user
        public string PosterSurname { get; set; } // from user
    }
    

1 个答案:

答案 0 :(得分:1)

您不需要执行上述三个选项中的任何一个。如果您有从Comment到User的导航属性,则可以在映射中处理该属性。类似的东西:

Mapper.CreateMap<Comment, CommentUserDto>().ForMember(dest => dest.UserName, opts => opts.MapFrom(src => src.User.UserName));

如果你没有导航属性,那么在初始映射之后,循环遍历dto对象列表并调用相应的_userRepository方法来获取用户信息并以这种方式填充dto对象的相应成员

修改

看到你的模型后,我会做什么(假设导航属性不是一个选项)是这样的:

var comments = _commentRepository.GetAll();

var results = new List<CommentUserDto>();

foreach(Comment comment in comments)
{
   var user = _userRepository.Get(comment.userId);
   var commentUserDto = new CommentUserDto
   {
      Content = comment.Content,
      CreationTime = comment.CreationTime,
      PosterName = user.Name,
      PosterSurname = user.Surname
   }

   results.Add(commentUserDto);
}

return results;