Создать контекст сущности в классе constrctor? или создать его всякий раз, когда нужно его использовать?

Я работаю над проектом, который еще кто-то разработал. В проекте это имеет

public class HomeController : Controller
{
    public HomeController() {
        _EntitiesContext = new EntitiesContext();
        _UsersContext = new UsersContext();
    }
    public UsersContext _UsersContext { get; set; }
    public EntitiesContext _EntitiesContext { get; set; }

    ......

Затем, когда ему понадобится запрос, он будет использовать этот контекст.

Обычно я делаю следующее: я не создаю эти контексты в HomeController (), вместо этого я создаю их, используя синтаксис .... всякий раз, когда они мне нужны. Я думаю, что это откроет соединение, сделает запрос, затем закроет соединение. в противном случае соединение будет всегда открытым. Если его используют слишком много людей, это может вызвать проблемы.

Я прав в этом? Я думаю, что читал это онлайн раньше, но не мог найти это больше.

Спасибо

2 ответа

Я думаю, что это откроет соединение, сделает запрос, затем закроет соединение.

Не совсем верно. ADO.NET использует connection pool, Таким образом, фактическое соединение с базой данных не открывается, оно берется из пула соединений. И когда вы вызываете Dispose для DbContext, он не закрывает соединение. Он просто возвращает его в пул, чтобы его можно было использовать позже. Так что не бойтесь оборачивать экземпляры DbContext в using заявления.

Обычной практикой является создание одного контекста для каждого HTTP-запроса, а затем использование того же контекста там, где вам это нужно.

Самый жизнеспособный способ достичь этого - ввести EntitiesContext зависимость (традиционно использующая конструктор) и самый простой способ ее внедрения с настроенным временем жизни объекта - это использование контейнера IoC.

Например (с помощью Microsoft Unity):

public HomeController(EntitiesContext context) {
    _EntitiesContext = context;
}

И конфигурация контейнера (при инициализации приложения):

container.RegisterType<EntitiesContext>(new PerHttpRequestLifetime());
Другие вопросы по тегам