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



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-克林特伍德(

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是等待的,因此您只需要编辑返回类型。
这是正确的定义:

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

希望这有帮助!

相关内容

最新更新