我有一个自定义 MVC 框架,我正在其中彻底检查路由 API。我正在尝试想出一种在我的框架中分离“设置”和“执行”的干净方法,该方法广泛使用委托(delegate)和泛型。现在我从调用方设想这一点:
//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{...}
如果我不需要存储调用者和调用者并且可以做到这一点,那么这会很好。但是,我确实需要存储调用程序和调用程序以便稍后执行。
目前我想做的事情:
- 将它们存储在
List<object>
中然后使用反射来调用它们。这看起来非常复杂,而且性能可能不太好
- 移动
AddRoute
执行。这会让人们更难使用我的 API,但最终可能是我唯一的“好”选择
- 问一个 SO 问题 :)
有没有什么好的方法可以存储这些泛型类型而无需进行大量痛苦的思考?
您可以存储一个为您执行所有转换的匿名委托(delegate)。
看起来下面的方法可行(未以任何方式测试):
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
为您保存一个引用,该类就会被保存。
请注意,我忽略了模式,但看起来您在那里不需要任何帮助。
我是一名优秀的程序员,十分优秀!