这是我仍然遇到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
放在任何公共属性上也无济于事。有没有办法拨打反思提供商正在做的事情?
答案 0 :(得分:1)
您可以设置:
config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.All);
到
config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.None);
在您不希望访问的任何课程上。我使用自定义属性的帮助来完成此操作,该属性指示我想要的特定类的权限。这与循环所有已知类型(实现我的属性)相结合,可以在没有显式代码的情况下单独设置每个类。
答案 1 :(得分:0)
我无法找到使用丰富数据模型拨打反射提供程序的方法。我最终建立了一个自定义提供商here。
如果有人提供了拨打反思提供者的方法,我会接受这个答案。