NancyFX模块在引导后将立即处理

时间:2019-01-27 20:41:22

标签: nancy

我使用Nancy 1.4.5编写了一个简单的应用程序,其中只有一个NancyModule。我正在使用带有默认引导程序的Nancy Self Hosting。

我想处置所有Nancy模块,并在应用程序配置(例如,当前端口)更改时重新发现它们。处置Nancy并对其进行重新构造时,一切似乎都在重新发现为止,除非在错误的时间调用了Dispose。 Dispose似乎是NancyModules发现过程的一部分。

在应用程序启动时,我调用以下代码:

_host = new NancyHost(hostConf, new Uri($"http://localhost:{Port}")); _host.Start();

在我的NancyModule中,我实现了IDisposable。

在构造NancyHost之前(在调用Start()之前),我看到NancyModule中的Dispose方法被命中了。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在使用TinyIOC容器注册进行了更多研究之后,我发现了正在发生的事情。

在初始自动注册期间构造/处置NancyModule实现类。 每次调用路线时也会对其进行构造/配置。

对于我的应用程序而言,这不是理想的行为,因为该服务背后的支持是持久连接,并且每次调用路由时重新连接都会为每个请求增加〜100ms响应时间。

最后,我实施了一个不需要的黑客程序,因为我不知道该怎么办。我创建了持久连接服务的静态单例实例,该实例可以通过单例中的函数进行重置。这样,即使在每次路由调用期间都构造了NancyModule,也不会因为每次都连接后端连接而对性能造成影响。

如果有一种方法可以将NancyModule设置为TinyIOC的单例注册,那会更好,但是似乎即使我通过执行自定义容器注册来显式设置它,每次仍在构造它被叫。

答案 1 :(得分:0)

您是在BootStrapper中覆盖ConfigureApplicationContainer还是ConfigureRequestContainer吗?

protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
    base.ConfigureApplicationContainer(container);

    // ...
}

protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
{
    base.ConfigureRequestContainer(container, context);

    // ...
}

来自documentation

  • ConfigureApplicationContainer-在执行Bootstrapper时调用一次,用于注册希望具有应用程序作用域生存期(应用程序单例)或注册为多实例的依赖项:
  • ConfigureRequestContainer-在解析与路由匹配的模块之前,每个请求调用一次,并用于注册具有请求生存期的单例。