哪里最好将主记录与其子记录一起带回来?存储库或服务?所有在一个方法或单独的方法?这已经困扰了我一段时间了,如果我能澄清一下,我会很高兴。我使用的是旧学校ADO.NET
和stored procedures
。我的方案是具有多个book
的{{1}}。
authors
和book
的我的域模型定义如下:
author
一本书可以有多位作者,因此列表:
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public List<Author> Authors { get; set; }
}
public class Author
{
public string Name { get; set; }
}
我目前有一个服务层方法,它调用存储库层方法来返回书籍详细信息。
我的public List<Author> Authors { get; set; }
定义如下:
book repository
我从我的图书服务层调用此方法,如下所示:
public async Task<Book> GetByBookIdAsync(int bookId)
{
string connectionString = ConfigurationManager.ConnectionStrings["Db"].ConnectionString;
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
await sqlConnection.OpenAsync();
using (SqlCommand sqlCommand = new SqlCommand("Books_GetByBookId", sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add(new SqlParameter("@BookId", bookId));
using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync())
{
Book book = null;
if (await sqlDataReader.ReadAsync())
{
book = new Book();
book.Id = bookId;
book.Title = sqlDataReader.GetFieldValue<string>(4);
}
return book;
}
}
}
}
我的服务图层会返回图书的public async Task<BookDTO> GetByBookIdAsync(int bookId)
{
BookDTO bookDTO = null;
Book book = await bookRepository.GetByBookIdAsync(bookId);
if (book != null)
{
bookDTO = new BookDTO();
bookDTO.Id = book.Id;
bookDTO.Title = book.Title;
}
return bookDTO;
}
个对象。
我在哪里填写作者列表?在我的书的存储库方法或我的书的服务层方法中?我的直觉在书的存储库方法中告诉我,但最简单的可能是在服务方法中?我可以调用本书的存储库来获取书籍详细信息,并再次调用作者存储库以获取书籍的作者列表。如果以这种方式完成,则不需要在我的书的域模型中有作者列表(它从未使用过),因为我现在可以用它的作者DTO对象列表直接填充书籍DTO对象吗?
我的DTO
对象如下所示:
book DTO
我希望有人可以帮我澄清一下。
答案 0 :(得分:1)
我更喜欢你最后的想法。为每个实体使用一个存储库,在服务中单独加载它们,并让服务将它们链接在一起。这是一个明确的设计,责任明确。
但是,我可以想象这种模式没有被占用的两种情况:
如果性能很重要 - 如果必须提高性能,最好通过一个过程调用加载多种类型的实体。这可能是将书及其所有作者加载在一起的原因。
如果作者在其他地方没有被用作单独的实体。如果作者列表就像书本实体的“列表属性”,那么书籍及其作者可能会被加载在一起,因此不再需要作者库。