0

Я использую два репозитория в своем CommentService.Паттерн репозитория - Объединение данных из двух таблиц

_commentRepository 
_userRepository 

Использование функции _commentRepository.GetAll() я получаю список всех моих комментариев со следующей информацией: [Id], [Содержание], [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. Использование включают каким-то образом объединить эти две таблицы (я использую EF)
  3. Создание диспетчера в моем слое домена, который принимает забота об объединении логики.

EDIT:

комментарий модель:

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 
} 
+0

Вы используете entityframework? – freshbm

+3

Мне лично нравится иметь репозиторий каждый для комментариев и пользователя, а затем поверх репозиториев. У меня есть мои классы обслуживания, которые дают мне объединенный объект из обоих этих репозиториев. Если вам небезразлична структура Entity, Include также является опцией – Yogi

+0

Да, я (уточню вопрос). – Sam

ответ

0

Вам не нужно делать ни один из трех вариантов, о которых вы говорите. Если у вас есть свойство навигации от комментария к пользователю, вы можете справиться с этим в своем сопоставлении. Что-то вроде:

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; 
+0

Спасибо, как я уже говорил, класс Comment имеет свойство UserId. Попробуйте ваш пример прямо сейчас. – Sam

+0

В вашем примере сопоставление выполняется между комментарием (имеет свойство userid) и CommentUserDto (только необходимые поля для просмотра). Но как насчет необходимой информации пользователя, которая также должна храниться в CommentUserDto, чтобы они были доступны для представления. Результатом должен быть список со всеми комментариями и с каждым комментарием соответствующая информация пользователя. – Sam

+0

Мы не можем помочь вам, если вы не публикуете свои классы моделей. Итак, пожалуйста, можете ли вы обновить свой вопрос с помощью классов моделей для комментариев, пользователей и комментариевUserDto (это швы, что я не могу это подчеркнуть) – freshbm

Смежные вопросы