2012-01-12 77 views
0

例如,假设我们有一个包含10个字段的用户实体,其中包含名字,姓氏,电子邮件,电话等内容。四个字段将公开显示,其余六个字段需要授权订阅(例如,两个用户标记为朋友)。使用WCF数据服务和实体框架控制每个实体实例字段的可见性

当以这种方式询问数据服务:http://example.com/users?auth_token=xxx时,请求者应该只看到他有权访问的字段。这很像Facebook的API如何工作。

我经历了为WCF编写自定义数据提供者的所有麻烦,然后意识到它将我的规则应用于整个集合。我需要的是集合中每个项目的规则集。我曾想过在WCF中编写钩子来将消息传递回去,但我觉得它可能有太多的开销。

任何人有什么想法可以做什么?甚至是一个不同的框架来解决我的需求?

回答

2

这有点违背了WCF DS和OData的想法。在OData中,您定义了一个模型(EDM),其中每个实体都有一组特定的属性。预计该类型的所有实例都具有所有这些属性。 您可以使用打开的类型(将实体类型标记为打开)来添加其他可选(每个实例)的属性,但这些属性将不在模型中。

典型地,这解决了以下两种方式之一:

1)拆分成实体两个实体类型。每个人都可以看到的“公共”,以及只有授权用户才能看到的“私人”。公共和私人之间有导航属性。在这种情况下,您甚至可以隐藏未经授权的用户的整个私人实体,使其不会在模型中可见。 (这是非常安全的,并且仍然在模型中完全定义)。

2)只有在请求是授权用户的情况下,才可以使用开放类型和属性并仅声明公共属性,然后使用打开属性填充实体。这不会使用其他类型“模仿”模型,但它也意味着私有属性从未在模型中声明,因此用户必须通过其他方法了解它们(例如,没有这些代码)。

使用自定义提供程序还可以实现其他功能,自定义提供程序可以根据请求更改模型。因此,在未经授权的用户情况下,您只能让该类型具有公共属性,并且在授权情况下可以让该类型具有所有属性。但是,它适用于该请求中的所有类型的实例(无论上面的#1和#2是否允许您在每个实例基础上执行此操作(如果您确实需要)。这可以像#1一样安全,并且仍然是静态类型的,但是它更令人困惑,因为客户通常不希望类型从请求变为请求。

+0

感谢您对此的评论。这是我担心的。随着代码变得复杂,它不是任何解决方案的粉丝。我想保持EF清洁,以便可以在其他地方使用。我想我会写一个通用处理程序并使用模板URI来匹配URL。 – 2012-01-18 16:17:35