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

2024-05-20

我正在尝试公开一个可供使用的模型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)建立WCFDataService使用可查询的集合类,例如:

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 lists.

2) 我必须申请IgnoreProperties属性来隐藏从基类型派生的任何成员。

3)我无法阻止不需要的实体被访问OData服务并导致错误。例如,我只希望公开 BLL 层对象,但似乎模型的反映远远超出了我添加到可查询列表中的类的成员,并选取了所有 DAL 类,导致错误未定义,而且与 BLL 类同名。 BLL 类成员没有到 DAL 类的链接。至少,我希望完全忽略这些类。

任何有关如何解决这些问题的指示将不胜感激。我应该对此采取不同的方法吗?例如,我应该实施IQueryable直接在我的模型集合中?

Thanks.


您正在使用的反射提供程序旨在遍历所有公共类型/属性。因此,#3,甚至可能是#2(我不完全明白问题是什么)是设计使然的。

#1 也是设计使然,但出于不同的原因 - 反射提供程序只能为每种类型层次结构公开一个实体集。它不支持所谓的“MEST”(每种类型多个实体集),因为它不知道选择哪一个。它需要实体类型和实体集之间一对一的映射。

反射提供程序适用于“易于”设置的简单服务。它绝对不是为定制而设计的。

如果您想要更好的控制,那么您需要自定义提供程序,它可以直接实现(如果它基于现有的 CLR 类,那么并不难),或者通过某个库(如上面评论中建议的库)实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何公开具有 OData 服务的派生类和成员的多层模型? 的相关文章