Соединение с БД не закрывается после завершения запроса в приложении NancyFx

Я создаю веб-приложение Нэнси и использую OrmLite для доступа к БД. Я заметил, что каждый запрос открывает новое соединение с БД и не закрывает его. Я думал, что регистрация класса OrmLiteConnection в контейнере Application сделает его областью применения, но, похоже, я что-то упустил.

Вот мой код (в ConfigureApplicationContainer):

container.Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register<OrmLiteConnection>(
            (cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open());

2 ответа

Решение

Я перенес регистрацию OrmLiteConnection в ConfigureRequestContainer, Потом я переборщил RequestStartup и добавил:

pipelines.AfterRequest += (ctx) => {
    //close the connection
    container.Resolve<OrmLiteConnection>().Dispose();
};

Вы должны добавить область для ваших регистраций:

container
    .Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider))
    .AsSingleton(); // I think this is by default, but sometimes being explicit is good.

container
    .Register<OrmLiteConnection>(
        (cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open())
    .AsPerRequestSingleton();;

AFAIK, это обеспечит удаление экземпляров в конце области. Поэтому, если вам нужно сделать больше, чем Dispose() тогда вам может понадобиться найти способ предоставления делегата, который может быть выполнен в это время.

Другие вопросы по тегам