我正在尝试公开一个可用于 OData
服务的模型。我目前采取的方法是:
1) 在模型中定义一个类来公开 IQueryable
集合,例如:
public class MyEntities
{
public IQueryable<Customer> Customers
{
get
{
return DataManager.GetCustomers().AsQueryable<Customer>();
}
}
public IQueryable<User> Users
{
get
{
return DataManager.GetUsers().AsQueryable<User>();
}
}
}
2) 使用可查询集合类设置 WCF DataService
,例如:
public class MyDataService : DataService<MyEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.SetEntitySetAccessRule("Users", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
我在使用这种方法时遇到了 3 个问题和/或限制:
1) 我无法将任何派生类集合添加到 IQueryable
列表中。
2) 我必须应用 IgnoreProperties
属性来隐藏从基类型派生的任何成员。
3) 我无法阻止 OData
服务访问不需要的实体并导致错误。例如,我只希望公开 BLL 层对象,但似乎模型的反射(reflect)远远超出了我添加到可查询列表中的类的成员,并选取了所有 DAL 类,导致错误未定义,并且还与 BLL 类同名。 BLL 类成员没有到 DAL 类的链接。至少,我希望完全忽略这些类。
任何有关如何解决这些问题的指示将不胜感激。我应该对此采取不同的方法吗?例如,我应该直接在模型集合中实现 IQueryable
吗?
谢谢。
最佳答案
您正在使用的反射提供程序旨在遍历所有公共(public)类型/属性。因此,#3,甚至可能是#2(我不完全明白问题所在)是设计使然。
#1 也是设计使然,但出于不同的原因 - 反射提供程序只能为每种类型层次结构公开一个实体集。它不支持所谓的“MEST”(每种类型多个实体集),因为它不知道选择哪一个。它需要实体类型和实体集之间存在 1 对 1 的映射。
反射提供程序适用于“易于”设置的简单服务。它绝对不是为定制而设计的。
如果您想要更好的控制,那么您需要自定义提供程序,它可以直接实现(如果它基于现有的 CLR 类,那么并不难),也可以通过某个库(如上面评论中建议的库)实现。
关于c# - 如何公开具有 OData 服务的派生类和成员的多层模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9091034/