2012-02-03 64 views
1

这是我仍然遇到的问题的延续here。我试图阻止OData反射提供程序试图公开我的程序集中的所有CLR类。有没有办法拨打OData服务反射提供程序?

考虑下面的CLR类:

public class Foo 
{ 
    public Guid FooID { get; set; } 
    public string FooName { get; set; } 
} 

及以下类暴露Foo作为IQueryable集合:

public class MyEntities 
{ 
    public IQueryable<Foo> Foos 
    { 
     get 
     { 
      return DataManager.GetFoos().AsQueryable<Foo>(); 
     } 
    } 
} 

而下面DataService类:

public class MyDataService : DataService<MyEntities> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("Foos", EntitySetRights.All); 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 
} 

这所有作品hunkey都这样做rey和DataService可以显示Foo的集合。如果变化Foo一个非常简单的基本对象扩展,如:

public class Foo : MyObjectBase 
{ 
    public Guid FooID { get; set; } 
    public string FooName { get; set; } 
} 

然后(即使我只是想揭露1集),反射提供商抓住扩展MyObjectBase所有对象,导致错误的负载。

的基类是实现多个接口,并提供另一个属性,如简单的抽象类:

public abstract class MyObjectBase: IDataObject, IDataErrorInfo, INotifyPropertyChanged, IDisposable 
{ 
    public virtual Guid ID { get; set; } 
} 

即使穿上任何公共属性IgnoreProperties这里没有帮助。有什么方法可以调出反射提供者正在做的事情吗?

+1

我有同样的问题,我无法找到很好的解决方案。我最终直接在Foo中加倍了MyObjectBase属性。 – 2012-02-03 01:44:14

+0

呃,这个项目中的几百个CLR类别并不是真正的选择。仍在制定自定义提供商路线。 – 2012-02-03 01:50:25

+0

的确,我只有一对夫妇。你可以有MyObjectBaseOdata和MyObjectBaseEverythingElse我猜... – 2012-02-03 01:52:44

回答

1

您可以设置:

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.All); 

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.None); 

在任何类你不想访问。我使用自定义属性的帮助来完成此操作,该自定义属性指示我想要为特定类授予的权限。这与循环遍历所有已知类型(实现我的属性)相结合,可以在没有显式代码的情况下单独设置每个类。

+0

+1谢谢M.我试图关闭一些类的权利。麻烦的是,所有的DAL类与我想要的相应BLL类(不同的名称空间)具有相同的名称。你可以在SetEntityAccessRule中指定一个完整或部分名称空间吗? – 2012-02-03 03:02:56

+0

我从来没有这样做,MSDN文档没有指定什么是合法的,所以我建议尝试一下,看看会发生什么。这可能不是你正在寻找的答案。 – 2012-02-03 03:08:06

+0

在不需要的类上使用SetEntitySetAccessRule通常似乎没有帮助。我甚至尝试将所有访问权限都从'config.SetEntitySetAccessRule(“*”,EntitySetRights.None);'并且仍然在数据上下文中找到没有找到这些类型的错误。 – 2012-02-03 03:14:16

0

我无法找到用富数据模型拨出反射提供程序的方法。我最终建立了一个定制提供商,如here所示。

如果有人提供拨打反射提供程序的方式,我会接受该答案。

相关问题