#asp.net-mvc #entity-framework #architecture
#asp.net-mvc #entity-framework #архитектура
Вопрос:
У меня есть следующий класс репозитория:
public class Model1Repository
{
private NEOGOV_IdeasEntities _dataContext;
public Model1Repository()
{
_dataContext = new NEOGOV_IdeasEntities();
}
public IdeaType IdeaType(int ID)
{
var q = from i in _dataContext.IdeaTypes where i.ID == ID select i;
return q.FirstOrDefault();
}
... rest methods....
}
следующий контроллер:
public class TestController : Controller
{
private Model1Repository _repository;
public TestController()
{
_repository = new Model1Repository();
}
public ActionResult Tagedit()
{
return View(_repository.GetDataFromDB1());
}
public ActionResult Avatar()
{
return View(_repository.GetDataFromDB2());
}
}
правильная ли это архитектура? Или нет? Как я понимаю, в моем случае переменная _repository создается для каждого запроса…
Комментарии:
1. Работает ли это? ДА. Это хорошо? Нет. Вы должны использовать внедрение зависимостей 🙂 Посмотрите на внедрение зависимостей с помощью Ninject. Его очень легко настроить.
Ответ №1:
Лично я бы создал экземпляр репозитория в действии контроллера, а не в конструкторе. Если вы уверены, что для всех действий контроллера потребуется репозиторий, то это достаточно справедливо, но поскольку операции с контроллером связаны с работой пользовательского интерфейса, нет ничего необычного в том, что методы контроллера этого не требуют.
Но в конце концов, это действительно стильная вещь (хорошо, возможно, с небольшими издержками производительности); если вы хотите сделать это таким образом, не стесняйтесь!
Комментарии:
1. ниже вы написали о _repository как одноэлементном. Это имеет смысл?
2. В вашей реализации _repository не является синглтоном, и это хорошо. Чтобы воспользоваться преимуществами пула соединений, вам необходимо быстро освободить контекст данных. Тот факт, что ваш _repository будет собирать мусор после действия контроллера, поможет этому произойти, тогда как использование одноэлементного шаблона этого не сделает. Но создание репозитория, когда он вам нужен, и его выпуск как можно быстрее еще больше повышает эффективность и улучшает масштабируемость.
Ответ №2:
Не могу ответить за всю архитектуру, но для тестового контроллера будет создан один и только один объект репозитория Model1Repository, а не по одному на запрос (HTTP-запрос).
Комментарии:
1. почему один? Отладчик сообщает, что конструктор контроллера вызывает каждый запрос. Ctor создает новую копию Model1Repository, ctor Model1Repository создает новую копию NEOGOV_IdeasEntities. Итак, каждый запрос создает новую копию NEOGOV_IdeasEntities….
2. Время жизни контроллера по умолчанию задается для каждого запроса, и поскольку _repository не является одноэлементным, каждый раз будет создаваться новый.