1

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

这是我的代码(在ConfigureApplicationContainer):

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

2 回答 2

0

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

pipelines.AfterRequest += (ctx) => {
    //close the connection
    container.Resolve<OrmLiteConnection>().Dispose();
};
于 2016-12-20T17:35:43.567 回答
0

您需要为您的注册添加范围

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()这些,您可能需要找到某种方式来提供可以在当时执行的委托。

于 2016-12-19T11:40:59.600 回答