使用ADO.NET

时间:2016-05-18 09:19:36

标签: c# sql-server stored-procedures ado.net repository

哪里最好将主记录与其子记录一起带回来?存储库或服务?所有在一个方法或单独的方法?这已经困扰了我一段时间了,如果我能澄清一下,我会很高兴。我使用的是旧学校ADO.NETstored procedures。我的方案是具有多个book的{​​{1}}。

authorsbook的我的域模型定义如下:

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

我希望有人可以帮我澄清一下。

1 个答案:

答案 0 :(得分:1)

我更喜欢你最后的想法。为每个实体使用一个存储库,在服务中单独加载它们,并让服务将它们链接在一起。这是一个明确的设计,责任明确。

但是,我可以想象这种模式没有被占用的两种情况:

  1. 如果性能很重要 - 如果必须提高性能,最好通过一个过程调用加载多种类型的实体。这可能是将书及其所有作者加载在一起的原因。

  2. 如果作者在其他地方没有被用作单独的实体。如果作者列表就像书本实体的“列表属性”,那么书籍及其作者可能会被加载在一起,因此不再需要作者库。