我们有一个用 Nancy(和 TinyIoc)实现的 ASP.NET REST 服务,它与一个相当大的遗留应用程序接口。我们想过渡到完全依赖注入。目前,我们的大多数模块都直接实例化控制器,并使用一个上下文类来保存使用该NancyContext Context属性的请求信息。像这样的东西:
public FooModule(ILegacyService legacyService) {
Get["/"] = parameters => new FooController(new RequestContext(Context), legacyService).GetFoo();
}
我们想直接在模块中注入控制器,并让所有事情都由 super-duper-happy-path 处理:)
我们的问题都源于我们需要来自NancyContext. url、headers 等。所以我们尝试了各种方法来实现依赖注入的必杀技。
尝试注入控制器失败,因为它们是在应用程序范围内实例化的,因此任何依赖RequestContext都不会具有当前上下文信息。即使注册RequestContext并ConfigureRequestContainer没有波及所有的家属,他们会持有对过期的引用RequestContext。
我们尝试使用 属性注入上下文IRequestStartup,这似乎是成功的,直到我们遇到并发问题。不同线程中的同时请求会覆盖应用程序范围RequestContext。
我们发现我们可以调用container.AutoRegister(),ConfigureRequestContainer但这导致了严重的延迟,因为注册需要几秒钟的时间来处理我们拥有的类型数量。
使用AsPerRequestSingleton()inConfigureApplicationContainer似乎它会注册一次,然后根据请求实例化,但似乎没有办法让自动注册遵守这一点。
似乎我们需要手动注册所有类型,并手动更新此配置。是这样吗?我们真的希望在每个请求的生命周期内进行某种类型的自动注册。
我创建了一个小型测试项目 ( https://github.com/Rassi/NancyIocTest ),我在其中尝试了其中一些解决方案。