Общее правило - создать один репозиторий на корень совокупности .
Где сводный корень можно рассматривать как «родительский»,и «потомок» не может существовать без родителя.
В вашем примере Author является совокупным корнем, поскольку Book не может существовать без Автор .(FK доказывает это).
Следовательно, у вас должен быть LibraryRepository , способный работать как с авторами, так и с книгами, с одним набором объектов Entity Framework.
Мы фактически применяем эти совокупные границы в нашем Репозитории, вводя ObjectSet в универсальный тип в Репозитории.
Таким образом, вы можете иметь:
public class LibraryRepository : IRepository<Author>, GenericRepository<Author>
{
public Author FindById(int id)
{
return _context.SingleOrDefault(x => x.AuthorId == id);
}
public Book FindById(int bookId)
{
return _context
.Where(x => x.Books.Any(y => y.BookId == bookId))
.Select(x => x.Books.SingleOrDefault(x => x.BookId == bookId))
.SingleOrDefault();
}
}
В приведенном выше примере _context
- это свойство protected
в универсальном репозитории, которое набирается как ObjectSet<Author>
(что в T
в универсальном репозитории).
Однако, посмотрите, как это грязно, найти книгу.Если вы обнаружите, что нуждаетесь в том, чтобы найти «ребенка» самостоятельно (например, не извлекая сначала родителя), то вам следует подумать и о создании хранилища книг.
Так что это сводится к двум вещам:
- Обеспечение совокупных границ
- Создание репозиториев, обслуживающих ваше приложение
Подумайте об интерфейсе пользователя, какая информация нужна каждому экрану, какая информация у него есть нарукой, чтобы идентифицировать эту часть информации (например, URL).