является ли это правильной архитектурой ASP.NET Приложение MVC и EF?

#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 не является одноэлементным, каждый раз будет создаваться новый.