Я был в очень похожем месте с OP некоторое время назад, поэтому я расширю ответ Робертса с некоторым кодом того, как я структурировал мое приложение asp.net mvc после изучения шаблона хранилища.
Итак, ваш проект QandA
У вас будет проект библиотеки классов с именем QandA.data
, здесь вы создадите свой файл edmx и все ваши классы структуры сущностей. Тогда у вас есть хранилище для каждой сущности, например:
public interface IRepository<T>
{
T Save(T entity);
void Delete(T entity);
IQueryable<T> GetAll();
T GetById(int id);
}
Тогда вы могли бы иметь либо фабрику, либо использовать Dependency Injection, чтобы получить собственно репозитории. Итак:
class QuestionRepo : IRepository<Question>
{
//call xxxEntites and get/save/delete yourentities here.
}
static class RepositoryFactory
{
public static IRepository<Question> GetQuestionRepo()
{
return new QuestionRepo();
}
}
Затем в вашем коде вызова (в вашем проекте asp.net) у вас есть
IRepository<Question> qRepo = RepositoryFactory.GetQuestionRepo();
Question q = qRepo.GetById(1);
Теперь преимущество выполнения вышеизложенного состоит в том, что ваш вызывающий код не знает, как проходят сущности, поэтому вы можете создать фиктивный репозиторий для тестирования вашего приложения.
static class RepositoryFactory
{
public static IRepository<Question> GetQuestionRepo()
{
return new FakeQuestionRepo();
//create your own fake repo with some fixed fake data.
}
}
Теперь ваш вызывающий код вообще не меняется, если вы выбросите его в фальшивый или настоящий репозиторий.
Кроме того, Роберт говорит в своем вопросе о ViewModel. Так что вы бы не сделали строго типизированную страницу типа Вопрос. Итак, у вас есть
class QuestionForm
{
public string Title
public string QuestionContent
}
Ваша страница будет иметь тип QuestionForm
, но в вашем контроллере создания вы возьмете данные из формы вопроса, заполните их в своей сущности Вопрос и затем отправите их через хранилище.
[HttpPost]
public ActionResult Create(QuestionForm quesfrm)
{
IRepository<Question> qRepo = RepositoryFactory.GetQuestionRepo();
Question ques = new Question {
AskedDate = DateTime.Now,
Title = quesfrm.Title,
Content = QuestionContent
}
qRepo.Save(ques);
}
Роберт упоминает одну из причин, почему вы должны это сделать, есть несколько других причин, и вы можете прочитать больше о моделях представления в SO. Также проверьте код для nerddinner
Возможно, вы захотите увидеть эти вопросы:
Должны ли репозитории реализовывать IQueryable ?
Шаблон репозитория: один класс репозитория для каждой сущности?
Надеюсь, это помогло.