【发布时间】:2012-02-25 17:10:11
【问题描述】:
这是我仍然遇到的问题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 放在此处的任何公共属性上也无济于事。有什么办法可以调低反射提供者正在做什么?
【问题讨论】:
-
我遇到了同样的问题,我找不到好的解决方案。我最终直接在 Foo 中将 MyObjectBase 属性加倍。
-
呃,这个项目中的几百个 CLR 类并不是一个真正的选择。仍在使用自定义提供程序路由。
-
没错,我只有一对。你可以有 MyObjectBaseOdata 和 MyObjectBaseEverythingElse 我猜...
标签: c# wcf-data-services odata iqueryable