Есть ли более логичное место для этого метода?
ИМО, да. У меня не было бы такого конкретного метода, если бы вам не требовалось много сообщений. Я бы Eager Load сообщений по требованию . (Подробнее об этом ниже)
Должен ли я положить его в PostRepository?
Сорт. LoadPosts(User user)
- это логин, специфичный для PostRepository, IMO. НО - это очень специфический метод .. это означает, что рано или поздно вы PostRepository будете очень заняты множеством конкретных методов. Обычно у нас есть универсальный репозиторий, который позволяет входить Expressions . Таким образом, вам не нужно создавать множество конкретных методов. У вас может быть один метод, за исключением выражений и извлекающий ваши различные запросы.
например.
IQueryable<Post> Find(Expression<Func<Post, bool>> predicate,
string[] includeAssociations);
Тогда вы можете использовать его, чтобы загружать то, что вам нужно.
например. Получить все сообщения для конкретного пользователя.
var posts = _postRepostitory
.Find(x => x.UserId = userId, new [] { "User" } )
.ToList();
или оборотная сторона, для пользователя, получите мне все свои сообщения ...
var user = _userRepository
.Find(x => x.UserId = userId, new [] { "Posts" } )
.ToList();
Если вам нужна помощь с кодом внутри метода Find
, просто спросите ... но это довольно тривиально.
Идея такова (по порядку, что крайне)
- выражение только что применено к сущности
Post
внутри скрытого контекста внутри экземпляра postRespository
.
- Наконец, вы
Include
для каждой требуемой ассоциации, последняя.
Ничего не запрограммировано. Все это определяется кодером, когда они вызывают метод Find :) Один метод для управления ими всеми.
ПРИМЕЧАНИЕ: Конечно, у меня на самом деле есть 4 - один без аргументов ... вплоть до того, который я показал, с 4 аргументами.
Что-то вроде CountPosts (int userId)?
(непроверенный, псевдо-код .. думая о моей голове)
var count = _postRepostiory
.Find(x => x.UserId = userId, new [] { "Posts" })
.Select(x => x.Posts).Count;
Должен ли я предложить перегрузку моему LoadMethod. Пример: Load (bool loadPosts)
Неа. сейчас не нужно.
Есть ли способ, что если я пишу myUser.Posts.Count (), сообщения загружаются автоматически, а не равны нулю?
Да, если вы последуете моим советам выше.
var user = _userRepository
.Find(x => x.UserId = userId, new [] { "Posts" })
.SingleOrDefault();
var postCount = user == null || user.Posts == null ? 0 : user.Posts.Count;
Офигеть и программировать, падаван !!