【发布时间】:2011-06-22 16:41:41
【问题描述】:
我当前的项目使用的是 IDesign 架构,所以我的所有层都是服务。我想让我的资源访问层的 CRUD 中的 Read 方法采用 lambda 表达式形式的谓词以及要提取的相关对象列表。这样资源访问层就非常通用了。
[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);
现在我发现了一些应该很明显的事情,那就是我无法序列化 lambda 表达式。我研究了将字符串解析为 lambda 表达式,但这也是不行的。
我可以使用任何方法将 lambda 表达式传递给服务吗?有没有更好的方法来做我想做的事情?
【问题讨论】:
-
您真的希望您的 Web 服务接受任何形式、形状或颜色的可执行代码吗?我会考虑这种方法的安全方面。
-
充其量你可以让它接受一个表达式的序列化版本,但不是一个 lambda,lambda 是一个方法指针,一个表达式是可以编译、分析等的东西的表示. 但是,我会再次考虑这里的安全方面。在我看来,这就是将 SQL 作为查询字符串的一部分传递给 Web 应用程序。
-
这个服务不会暴露,它用在架构的更高层。而且我相信我读到过,表达式也不能被序列化,至少不是没有很大的困难。
-
Lambdas 不能被序列化,它们已经被编译为可执行代码,即。它们是指向可执行代码的方法指针。一个表情,至少你有一个战斗的机会,但也不容易。可能,不容易。使用 lambda,您将不得不反编译代码,并将 IL 传递给服务器,而这在这种情况下不一定有效。
-
@OpticalDelusion:关键问题是“不接触谁?”要回答安全问题,您需要做的是建立一个威胁模型。也就是说,绘制系统中所有不同组件的图表,然后确定这些组件之间的“信任边界”是什么。然后问自己“每个组件都保护了哪些资源?”以及“攻击者如何在每个边界破坏受保护的资源?”如果没有办法让危险系统被边界外的攻击者引诱攻击资源,那么你很好。