我的具体上下文是一个自托管的 Nancy 应用程序,我在其中使用 RavenDb 嵌入式文档数据库。
我的引导程序如下所示:
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(){...}
}
问题是我期望在 NanyHost 停止时调用 IDocumentStore 和我的自定义一次性类型的 Dispose 方法。
NancyHost 实现 IDisposable,TinyIoCContainer 实现 IDisposable,如果我将实现 IDisposable 的类型注册到请求容器中,它将被释放。我几乎可以肯定,当主机被处置时,容器将被处置,并且所有已注册的实例都将被处置。
我知道我可以在引导程序之外存储对文档存储的引用,并在主机停止后将其处理掉,我还可以想到一些其他技巧,例如让引导程序实现 IDisposable 并在主机停止后手动处理它,但我在跳跃有一种更自动的方式来处理所有已注册实例的处置。
我是否错过了一些在应用程序容器中注册的单例实例上调用 Dispose() 的巧妙方法?
我的猜测是,由于主机和应用程序容器预计会一直存在到应用程序结束,因此处理容器不是优先事项,但如果是这种情况,这似乎是一种不好的做法。
更新:发布后,我在 nancy 组上找到了这个线程,其中有一些与此相关的信息,但有点旧。