【问题标题】:Capturing 'this' in Nancy Lambda Capture在 Nancy Lambda Capture 中捕获“this”
【发布时间】:2014-07-07 22:09:33
【问题描述】:

我有一个看起来像这样的 Nancy 模块

public class Configurer : NancyModule
{
    private Settings mSettings;

    public Configurer()
    {
        mSettings = new Settings();

        Get["/"] = parameters =>
        {
            // Do something with mSettings here
            mSettings.Name = new string("blah");
            // and then return a response
            return Response.AsJson<Settings>(mSettings);.
        };
    }
}

我遇到的问题是mSettings 始终是null(我假设是因为我没有在 lamdba 闭包中捕获this。我尝试在闭包中传递它,但它不起作用)。我也尝试过使用参数动态字典,但也失败了。是否可以在 nancy 模块中使用成员变量,如果可以,怎么做?我可能遗漏了一些明显的东西!

在创建设置等方面没有抛出异常,我可以在课堂的其他地方使用它,只是不能在 Lambdas 中使用。该类也是线程安全的,我只是没有将它添加到上面的示例中。

【问题讨论】:

  • 这是您唯一一次为mSettings 字段赋值吗?
  • @Dirk 在实际代码中,mSettings 只是在 GET 中真正被读取,它的设置在其他地方填充,但是它们可以在类中的其他地方访问,并且值符合预期。该类是线程安全的,因此据我所知,它不是数据竞争。当我尝试从 GET 访问时,该类的任何成员变量都为 null 或默认值。因此,为什么我认为它与捕获“this”有关
  • @BenJ 不确定这会有什么帮助。上面的场景很幼稚,因为它创建了对象的本地副本。真正的代码从构造函数的其他地方收集信息,然后创建对象的副本。因此,我不能将设置作为参数传递,因为成员设置为空(根据 GET)
  • 捕获mSettings没有问题。如果它在 lambda 表达式中是 null,那么它要么从未被赋值,要么已被赋值给 null。您可以通过设置字段readonly 来检查您是否不小心为其分配了另一个值,这样只有构造函数可以写入它,如果其他方法尝试这样做,您会得到编译时错误。
  • @YuvalItzchakov 我发现 Nancy 模块在每次调用时都会重建,即它们无法保留状态信息。我将不得不在其他地方维护状态并在需要时调用它。无论如何感谢您的帮助

标签: c# lambda nancy


【解决方案1】:

事实证明,在每次调用 Nancy 路由(GET 等)时,都会构建一个新版本的 Nancy 模块。因此,生命周期仅与单个调用一样长。这意味着在定义 Nancy 路由之前,必须在构造函数中构造任何成员变量。

这样做的缺点是你不能在类的其他地方修改或保持状态。因此有必要将状态信息保存在别处,并提供一个接口从 Nancy 模块中检索它。

上面的示例将按预期工作(因此不是最好的示例),但是在我的实际用例中,mSettings 以另一种方法填充到类中的其他位置,并且仅在状态无效时在 Nancy 路由中读取.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多