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

时间:2018-08-09 13:13:29

标签: c# lambda nancy func

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

依赖软件包: Nancy(版本: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());
        }
    }
}

2 个答案:

答案 0 :(得分:4)

这应该有效:

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);
    }
}

答案 1 :(得分:2)

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

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

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

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

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

希望这会有所帮助!