3

我正在将 DbContext 注册到TinyIoCContainer传递ConfigureRequestContainerDefaultNancyBootstrapper.

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

问:一次性实例是否真的在 TinyIoCContainer 中的请求结束时被丢弃?

引导程序

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);
}
4

2 回答 2

2

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

container.Register<IContext>(new Context(new SQLiteConnection(connString), true));
于 2017-05-05T09:43:34.687 回答
0

没有经常使用 TinyIoC,但是这个页面说每个请求的注册是不同的,不确定是否应该总是这样。

https://github.com/grumpydev/TinyIoC/wiki/Registration---lifetimes

于 2017-05-05T09:30:30.067 回答