【问题标题】:Castle - Using Factory Method and Transient LifestyleCastle - 使用工厂方法和瞬态生活方式
【发布时间】:2009-12-10 18:00:02
【问题描述】:

我的应用程序启动方法中有以下代码以及 设置容器和工厂支持的代码。工厂 方法似乎只被调用一次,而不是每次会话 需要。

_container.Kernel.Register(
    Component.For<ISession>().LifeStyle.Transient
    .UsingFactoryMethod(() =>
    {
        //Any line of code will only be hit once the first time ISession is requested.
    }));

我最初使用主干中的 build 1509,但更新为使用 build 1548 同样的结果。如果您需要更多信息来帮助,请告诉我 我。

注意:这是交叉发布到城堡邮件列表等待批准。

注意 2: 此代码适用于最新版本的 Windsor。但是,我们正在使用主干构建,因为我们需要变更集 5927(由 mausch 于 2009 年 8 月 13 日创建)中的功能。

见:

  1. Register Multiple Components for Single Interface Using Castle Windsor
  2. http://fisheye2.atlassian.com/changelog/castleproject/?cs=5927

【问题讨论】:

    标签: c# castle-windsor ioc-container


    【解决方案1】:

    你为什么不使用 PerWebRequest 生命周期来为这个组件,或者更好的 Windsor 的 NHibernate 集成工具?

    现在回到真正的问题。

    您的代码不起作用,因为它有错误。您没有将引用存储在当前的 HttpContext 中。您将引用存储在 HttpContext 中,该引用是对您传递的委托的第一次调用的当前状态。匿名委托(或包含它的匿名类)存储对 HttpContext 的第一个实例的引用,因此您的 if 条件仅在请求第一次到达时才会为 false。

    【讨论】:

    • 我不能使用 PerWebRequest,因为当我在应用程序启动中使用它时它会爆炸。我修改了这个问题,这样当我在调试器中单步执行代码时,工厂方法中的第一行代码只会在第一次请求 ISession 时被命中,并且永远不会再被命中。短暂的生活方式似乎行不通。
    • 如果您建议将 .UsingFactoryMethod 与 Lifestyle.Transient 结合使用不起作用,那么您就错了。我刚刚在后备箱上测试过。
    • 再次,为什么不使用 NHibernate 集成工具?我确信它可以处理您的应用程序启动等场景。
    • 更新问题。代码适用于发布,但不是我展示的最新版本的主干版本 1548?
    • 有关在 application_start 中定义容器时让 PerWebRequest 工作的方法,看看这是否有帮助:blog.ploeh.dk/2009/11/17/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多