2

我有一个自定义的 MVC 框架,我正在对路由 API 进行大修。我试图想出一种干净的方法来隔离我的框架中的“设置”和“执行”,它广泛使用了委托和泛型。现在我从调用方设想这个:

//setup
MyRouter.AddRoute("/foo", () => new MyHandler(), (h) => h.MyMethod);
//h.MyMethod only exists in MyHandler, not in HttpHandler
//execution
MyRouter.Execute(HttpContext);

我目前可以使 AddRoute 方法签名“工作”:

delegate T HandlerInvoker<T>();
delegate string HandlerCallMethod<T>(T handler);
...
public void AddRoute<T>(string pattern, HandlerInvoker<T> invoker, HandlerCallMethod<T> caller) where T is HttpHandler{...}

如果我不需要存储调用者和调用者并且可以做到这一点,那么这会很好。但是,我确实需要存储调用者和调用者以供以后执行。

目前我想做的事情:

  • 将它们存储在 a 中List<object>,然后使用反射来调用它们。这似乎非常复杂,可能性能不太好
  • 走向AddRoute执行。这可能会让人们更难使用我的 API,但最终可能会成为我唯一的“好”选择
  • 问一个SO问题:)

有没有什么好方法可以存储这些泛型类型而无需大量痛苦的反思?

4

1 回答 1

1

您可以存储一个匿名委托来为您执行所有转换。

看起来以下内容会起作用(未以任何方式测试):

List<Action> handlers;
handlers.Add(() => caller(invoker()));

请注意,如果您正在缓存,这将不起作用invoker

在这种情况下,您需要保留价值,Lazy应该做到这一点。

List<Action> handlers;
Lazy<T> lazy = new Lazy<T>(invoker);
handlers.Add(() => caller(lazy.Value);

后者只会创建invoker每次调用该方法的返回值的一个实例。并且由于lazy是一个局部变量,它会自动推入一个类,只要为handlers您保留一个引用,它就会被保留。

请注意,我忽略了模式,但您似乎不需要任何帮助。

于 2013-02-12T04:13:52.093 回答