【问题标题】:Using Castle Windsor to inject IRailsEngineContext使用 Castle Windsor 注入 IRailsEngineContext
【发布时间】:2009-06-16 18:44:15
【问题描述】:

问题

我在 Castle Monorail 项目中使用 Castle Windsor 作为 IoC 容器。我想将 IRailsEngineContext 的当前实例注入到从控制器中的容器解析的对象中。

上下文

我想将 rails 上下文注入的对象将用于包装会话对象,以保留以前查看的记录的 ID。然后将引用它以确保不会再次查看它们。

替代解决方案

我可以在每次调用时将上下文传递给方法或手动注入,但最好直接从容器中注入。

问题

我想不出一种在容器中注入上下文的方法。有没有办法做到这一点?这有意义吗?

【问题讨论】:

    标签: inversion-of-control controller castle-windsor httpcontext castle-monorail


    【解决方案1】:
    Container.Register(
        Component.For<IRailsEngineContext>()
                 .UsingFactoryMethod(()=>MonoRailHttpHandler.CurrentContext)
                 .LifeStyle.Transient
    );
    

    IRailsEngineContext - 我猜它来自一个 old 版本的 MonoRail。我建议你换一个新的,越早越好。

    【讨论】:

    • btw - 注意不要将它注入到 Singleton 服务中 - 这些只会解析一次,并将使用第一个 Context 进行连续请求。如果必须在 Singlton 上使用上下文,请直接使用 MRHttpHandler.CurrentContext,或者使用自定义 IContextProvider 注入它,每次都向处理程序询问当前上下文。
    • @Ken:您可以使用瞬态或 PerWebRequest 生活方式注册它,然后 lambda 工厂将按预期调用。
    • @mausch - 如果它是单例的依赖项,则不会。说 class Something { ... public Something (IEngineContext context);并且Something被注册为单例。第一次解决某事时,工厂方法将生成正确的上下文。在一个连续的请求中,Something 的同一个 ol' 实例将被提供,持有对 old 上下文的引用,(这是 wrong 上下文)对于任何非-作为单例服务的依赖项的单例服务
    • @ken:但这是关于其他组件的生活方式,而不是这个......如果我有一个依赖于 IRailsEngineContext 的瞬态组件 Foo 并且我将 IRailsEngineContext 注册为单例(就像你的答案中的代码) ,然后 Foo 将在连续请求中获得无效的 IRailsEngineContext。通过将 IRailsEngineContext 注册为瞬态,这种情况得到解决。现在如果 Foo 是一个单例并且它依赖于一个瞬态,那就是 Foo 的问题。
    • 这就像我前段时间写的博客一样:bugsquash.blogspot.com/2008/12/… 这反过来又产生了 UsingFactoryMethod(),只是我在这篇文章中使用了 System.Web.Abstractions 而不是 Monorail 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多