有没有办法拨打OData服务反射提供商?

时间:2012-02-03 01:39:11

标签: c# wcf-data-services odata iqueryable

这是我仍然遇到here问题的延续。我试图阻止OData反射提供程序尝试公开程序集中的所有CLR类。

考虑以下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; 
    } 
}

这一切都很有用,而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放在任何公共属性上也无济于事。有没有办法拨打反思提供商正在做的事情?

2 个答案:

答案 0 :(得分:1)

您可以设置:

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

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

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

答案 1 :(得分:0)

我无法找到使用丰富数据模型拨打反射提供程序的方法。我最终建立了一个自定义提供商here

如果有人提供了拨打反思提供者的方法,我会接受这个答案。