我使用ADO.NET来读取一串从数据库中的数据到内存中的对象。
这是我的域模型:
// Question.cs
public class Question
{
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public IEnumerable<Tag> Tags { get; set; }
}
// Tag.cs
public class Tag
{
public int ID { get; set; }
public string Name { get; set; }
}
在检索的问题的列表,我想对每个问题获取相关的标签。 我能做到这一点,如下所示:
// QuestionRepository.cs
public IList<Question> FindAll()
{
var questions = new List<Question>();
using (SqlConnection conn = DB.GetSqlConnection())
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from questions";
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Question question = new Question();
// Populate the question object using reader
question.Load(reader);
questions.Add(question);
}
reader.Close();
}
}
return questions;
}
// Question.cs
public void Load(SqlDataReader reader)
{
ID = int.Parse(reader["ID"].ToString());
Title = reader["Title"].ToString();
Description = reader["Description"].ToString();
// Use Tag Repository to find all the tags for a particular question
Tags = tagRepository.GetAllTagsForQuestionById(ID);
}
return questions;
}
// TagRepository.cs
public List<Tag> GetAllTagsForQuestionById(int id)
{
List<Tag> tags = new List<Tag> ();
// Build sql query to retrive the tags
// Build the in-memory list of tags
return tags;
}
我的问题是,是否有任何的最佳做法/模式从数据库中获取相关的对象?
大多数的SO问题,我碰到加载相关的数据提供了实体框架的解决方案。 目前还没有答案的这个重复的问题。
即使我的代码工作,我想知道其他的方法来这样做。 我跨来到最接近解释的定位我的具体问题是Martin Fowler的延迟加载模式,我相信,会导致以下实现:
public class Question
{
private TagRepository tagRepo = new TagRepository();
private IList<Tag> tags;
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public IEnumerable<Tag> Tags {
get
{
if (tags == null)
{
tags = tagRepo.GetAllTagsForQuestionById(ID);
}
return tags;
}
}
}
是否有任何其他的选择吗?