DefaultNancyBootstrapper
のConfigureRequestContainer
メソッドに渡されたTinyIoCContainer
にDbContextを登録しています。IDisposableオブジェクトは、RequestContainerを使用してNancyリクエストの最後に処理されますか?
これは正常に機能しますが、要求が完了するとコンテキストのDispose
メソッドが呼び出されることはありません。私はDbContextが接続を閉じる要求(SQLiteを使用している)の後に破棄されることを期待しています。
Q: 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);
}
なぜテストしないのですか?あなたのDisposeメソッドにトレースラインを入れてください。しかし、 'public new void Dispose()'は 'void IDisposable.Dispose()'ではありません。それが「新しい」という意味です。 – Aron
私は 'base.Dispose'行にブレークポイントを置いてテストしました。' using'ステートメント内でコンテキストを使用すると呼び出されるので、リクエスト後に呼び出されると考えました。それを悪用している可能性があります!トレースラインを追加してみます。ありがとう。 – Tom
あなたは本当に 'new'を' override'に置き換えたいと思っています。 – Aron