3

永続化のために NHibernate を使用するクラス ライブラリで単体テストを行っています。NHibernate は、テスト目的で Sqlite インメモリ データベースを使用しています。通常の状況では、StructureMap にセッションを開始させるのは簡単です。

ただし、テスト速度を向上させるためにメモリ内データベースを使用しているため、テスト中に使用できる単一のセッションが必要です (新しいデータベースを作成すると、データベースが吹き飛ばされるため)。そして、もうひとつシワがあります。現在私を悩ませているのは、カスタム NHibernate ベースの ASP.NET メンバーシップ プロバイダーのテストです。これらは明らかに AppDomain ごとに 1 回作成されるため、明らかな理由からセッションを挿入するべきではありません。

その型をインスタンス化する方法を指示するビットを維持しながら、特定の型のインスタンスを取り除くように指示する方法は構造マップにありますか? 本当に、それを回避できれば、HttpScoped オブジェクトの有効期間のように動作させるだけですが、どうやら Http リクエストのコンテキスト内でしかそれを行うことができません。構造マップから出てくるオブジェクトの寿命を手動で制御する簡単な方法はありますか?

これが長く、ばかげた質問である可能性があることをお詫びします。私はこのプロジェクトに一人で参加しているので、アイデアをぶつけてくれる人が実際にはいません。

4

2 に答える 2

1

有効期間を制御する実際のセッションに委任する独自の ISession 実装でセッションをラップできます。次に、独自の ISession をインスタンスとして登録します。

于 2012-10-18T09:42:06.363 に答える
0

Func 型のプライベート変数とともに、プロバイダー用に 2 つのコンストラクターを作成することになりました。デフォルトでは、その値は、StructureMap の ObjectFactory を使用してセッションを作成するための標準コードに設定されていました。

Func 型のオブジェクトをパラメーターとして受け入れた、オーバーロードされたコンストラクター。そうすれば、必要に応じてその型のインスタンスを作成するための戦略を挿入できますが、それ以外の場合は、長時間の作業を行う必要はありません。私のテストでは、NUnit セットアップ メソッドでセッションを作成し、Teardown で破棄しました。私はこの考えが好きではありませんが、今のところそれを引き裂くほど嫌いではありません....まだ.

これにより、テーブルに関して発生していたエラーが解消されました。しかし、私が作成した条件では、何らかの理由で NHibernate がメモリ内の sqlite データベースに書き込めないようです。現在、ファイル システム内の 1 つに書き込めるかどうかを確認するためのテストに取り組んでいます。理想的ではありませんが、ディスクへの書き込みのパフォーマンスが実際に低下し始めるまでには、かなりの時間がかかります (願っています)。

于 2012-10-18T22:38:03.417 に答える