请求在NancyFx应用程序中结束后,数据库连接未关闭

时间:2016-12-18 10:09:23

标签: database-connection nancy tinyioc

我正在构建一个Nancy Web应用程序,并使用OrmLite进行数据库访问。我注意到每个请求都会打开一个新的数据库连接并且不会关闭它。我认为在Application容器中注册OrmLiteConnection类会使它成为应用程序作用域,但看起来我错过了什么。

这是我的代码(在ConfigureApplicationContainer中):

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

2 个答案:

答案 0 :(得分:0)

您需要在注册中添加scope

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(),那么您可能需要找到一种方法来提供当时可以执行的委托。

答案 1 :(得分:0)

我已将OrmLiteConnection的注册移至ConfigureRequestContainer。然后我覆盖RequestStartup并添加:

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