我们正在进行的项目是一个经典的 3 层架构。第 1 层是数据库服务器,第 2 层是应用程序服务,第 3 层是表示层(网站)。
在应用程序服务层中,我有一个项目,其中包括一个实体框架模型和一个基于 WCF 数据服务的服务,该服务公开模型中的实体,例如:
public class DataService : DataService< PortalEntities >
这是一个成熟的 OData 服务,可以通过 URI 进行查询,例如:/dataservice.svc/mytable?$filter=contains(fieldname,’string’)
. 这对于使用 jQuery 开发任何东西的人来说非常棒,因为他们所要做的就是定义查询。问题是这个服务是一个中间层,所以它不能被外界看到。
我正在尝试的解决方案是在网站上公开另一个 WCF 数据服务,该服务公开由服务引用创建的实体。如果我向中间层服务添加服务引用,它会给我一个数据上下文,该数据上下文正在新的 WCF 数据服务中使用:
public class DataService : DataService< PortalEntities >
我必须覆盖 CreateDataSource:
protected override PortalEntities CreateDataSource()
{
return new PortalEntities(GetMianModelServiceUri());
}
新服务确实像代理一样,并返回暴露的实体(查询.../Services/OData/DataService.svc/tbl_Country
工作正常)。
但是当一个查询被传递给服务时,例如:.../OData/DataService.svc/tbl_Country?$select=Name
它抛出一个未实现的异常。
关于如何扩展网站服务以使其支持与中间层服务相同的查询的任何想法?