如何将 Func<> property/method 传递给 NancyFx Get() 方法?

How to pass a Func<> property/method to a NancyFx Get() method?

NancyFx (2.x) NancyModule.Get() 方法定义为:

public virtual void Get(string path, Func<dynamic, object> action, [Func<NancyContext, bool> condition = null], [string name = null]);

正常的用法是:

public class MyModule
{
    public MyModule() 
    {
        this.Get("/", parameters => {
            this.RequestHandler = new RequestHandler();

            return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
        });
    }
}

我想将第二个参数定义为 属性,这样我就可以像这样用于多个路径:

public class MyModule
{
    Func<dynamic, object> indexHandler = parameters => {
        // Error: Keyword "this" is not available in this context
        this.RequestHandler = new RequestHandler();

        // Error: Keyword "this" is not available in this context
        return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
    };

    public MyModule() 
    {
        this.Get("/", indexHandler);
        this.Get("/index", indexHandler);
    }
}

如果我这样做,它会起作用:

public class MyModule
{
    public MyModule() 
    {
        Func<dynamic, object> indexHandler = parameters => {
            this.RequestHandler = new RequestHandler();

            return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
        };

        this.Get("/", indexHandler);
        this.Get("/index", indexHandler);
    }
}

但我不想在构造函数中定义它。我究竟做错了什么?还有其他方法吗?

MVCE

依赖包:南希(版本:2.0.0-clinteastwood)

using Nancy;
using Nancy.Responses.Negotiation;

namespace MyNamespace
{
    public class MyModule : NancyModule
    {
        private RequestHandler RequestHandler;
        private object IndexHandler(dynamic parameters)
        {
            this.RequestHandler = new RequestHandler();
            var someOtherInfo = "";
            return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
        }

        public MyModule()
        {
            this.Get("/", IndexHandler);
            this.Get("/index", IndexHandler);

            this.Get("/home", parameters => {
                return this.Negotiate.WithView("myview.html");
            });
        }
    }

    public class RequestHandler
    {
        public Negotiator HandleRequest(string path, dynamic parameters, string someOtherInfo)
        {
            return new Negotiator(new NancyContext());
        }
    }
}

这应该有效:

public class MyModule
{
    public MyModule() 
    {
       this.Get("/", IndexHandler);
       this.Get("/index", IndexHandler);
    }

    private object IndexHandler(dynamic parameters) {
        this.RequestHandler = new RequestHandler();
        return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
    }
}

Andrew 的回答是有效的,应该已经足够了,但显然(在您的 MVCE 中)该方法定义不存在。

这是正确的定义(至少是 VS 想要的):

public virtual void Get(string path, Func<object, Task<object>> action, Func<NancyContext, bool> condition = null, string name = null)

幸运的是,您的 HandleRequest 可以等待,因此您只需编辑 return 类型。
这是正确的定义:

private Task<object> IndexHandler(dynamic parameters)
{
    this.RequestHandler = new RequestHandler();
    var someOtherInfo = "";
    return this.RequestHandler.HandleRequest("/", parameters, someOtherInfo);
}

希望对您有所帮助!