私の特定のコンテキストは、RavenDb 埋め込みドキュメント データベースを使用している自己ホスト型の Nancy アプリケーションです。
私のブートストラップは次のようになります。
public class MyBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register<IDocumentStore>(CreateDefaultStore());
container.Register<IDoSomething, MyOtherType>().AsSingleton(); // implements IDisposable
}
private static IDocumentStore CreateDefaultStore(){...}
}
問題は、IDocumentStore の Dispose メソッドと、NanyHost が停止したときにカスタムの使い捨て型が呼び出されることを期待していたことです。
NancyHost は IDisposable を実装し、TinyIoCContainer は IDisposable を実装します。IDisposable を実装する型をリクエスト コンテナーに登録すると、破棄されます。ホストが破棄されるとコンテナが破棄され、登録されているすべてのインスタンスが破棄されることはほぼ確実でした。
ブートストラップの外部にドキュメント ストアへの参照を保存し、ホストが停止した後にそれを破棄できることはわかっています。また、ブートストラップに IDisposable を実装させ、ホストが停止した後に手動で破棄するなどの他のトリックも考えられますが、ホッピングしていました。登録されたすべてのインスタンスの破棄をより自動的に処理する方法があることを確認してください。
アプリケーション コンテナーに登録されているシングルトン インスタンスで Dispose() を呼び出す賢い方法がありませんか?
私の推測では、ホストとアプリケーション コンテナーはアプリケーションが終了するまで存続することが期待されているため、コンテナーを破棄することは優先事項ではありませんでしたが、それでも、そうであれば、これは悪い習慣のように思えます。
更新: 投稿後、nancy グループでこのスレッドを見つけました。このスレッドには、これに関連する情報がありますが、少し古いです。