gpt4 book ai didi

c# - IDisposable 对象是否在使用 RequestContainer 的 Nancy 请求结束时被释放?

转载 作者:行者123 更新时间:2023-11-30 16:44:16 25 4
gpt4 key购买 nike

我正在将一个 DbContext 注册到 TinyIoCContainer 上,它被传递到 DefaultNancyBootstrapper 上的 ConfigureRequestContainer 方法中。

虽然这工作正常,但我注意到一旦请求完成,上下文中的 Dispose 方法就不会被调用。我希望在请求关闭连接后处理 DbContext(我们使用的是 SQLite)。

问:一次性实例实际上是在 TinyIoCContainer 中的请求结束时处理的吗?

Bootstrap

protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
{
base.ConfigureRequestContainer(container, context);

container.Register<IContext>((_,__) =>
{
// Code here to get connection string
return new Context(new SQLiteConnection(connString), true);
});
}

上下文

public interface IContext : IDisposable
{
...
}

public class Context : DbContext, IContext
{
...

public new void Dispose()
{
base.Dispose(); // This never gets called
}
}

更新

标记的答案最终是正确的。我基本上不得不做这样的事情:

if (string.IsNullOrEmpty(context.Request.UserHostAddress))
{
container.Register<IContext>((_,__) => null);
}
else
{
// Get username from request headers
// Build up SQLite connection string based off username
var dbContext = new Context(new SQLiteConnection(connString));
container.Register<IContext>(dbContext);
}

最佳答案

我认为这是因为您使用的是手动工厂注册,它希望您自己控制生命周期。无论如何,您可能不想使用它,因为每次您使用那里的代码请求一个上下文时,您都会创建一个新的上下文 - 将其切换到实例注册,您应该没问题。

container.Register<IContext>(new Context(new SQLiteConnection(connString), true));

关于c# - IDisposable 对象是否在使用 RequestContainer 的 Nancy 请求结束时被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com