c# - 如何公开具有 OData 服务的派生类和成员的多层模型?

标签 c# wcf-data-services odata iqueryable

我正在尝试公开一个可用于 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/

相关文章:

Java、Spring 和 OData 休息服务

c# - 如何在 Entity Framework 中获取表的架构名称?

c# - 使用 GCP 的数据存储时如何区分代码是在模拟器中运行还是在 GKE 中运行

.net - 以编程方式配置 wcf 服务

c# - 在无类型实体上应用查询选项

javascript - 如何使用 datajs 进行同步 OData 请求?

c# - 检查您是否在 wcf 服务中

c# - 如何在两种(数字)数据类型之间进行转换而不丢失任何数据?

wcf-data-services - 如何使用 WCF 数据服务加载二级实体关系?

c# - WCF 和 Entity Framework ,隐藏列/实体属性