2017-05-05 4 views
2

DefaultNancyBootstrapperConfigureRequestContainerメソッドに渡された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); 
} 
+0

なぜテストしないのですか?あなたのDisposeメソッドにトレースラインを入れてください。しかし、 'public new void Dispose()'は 'void IDisposable.Dispose()'ではありません。それが「新しい」という意味です。 – Aron

+0

私は 'base.Dispose'行にブレークポイントを置いてテストしました。' using'ステートメント内でコンテキストを使用すると呼び出されるので、リクエスト後に呼び出されると考えました。それを悪用している可能性があります!トレースラインを追加してみます。ありがとう。 – Tom

+0

あなたは本当に 'new'を' override'に置き換えたいと思っています。 – Aron

答えて

1

私はあなたが手動で工場出荷時の登録を使用しているので、その、それはあなたが一生を自分でコントロールする予定だと思います。とにかくそれを使用したくないかもしれません。あなたがそこにあるコードを要求するたびに新しいコンテキストを作成しているので、それをインスタンス登録に切り替えればOKです。

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

要求ヘッダーで送信されたユーザー名によって使用するデータベースが決まるため、ファクトリ登録が必要です。残念ながら、メソッドが初めて呼び出されたときにヘッダーは使用できません。私はRequestContainer上の登録が要求の存続期間を最後に引き継ぐと仮定していましたが、間違っているはずです。 このhttps://github.com/grumpydev/TinyIoC/wiki/Registration---lifetimesには、要求ごとのライフタイムを指定するための拡張子が記載されています。 – Tom

関連する問題