1

我想知道我将在哪里使用 WCF 数据服务 (Odata) 编写我的自定义业务逻辑。

我是 oData 的新手,虽然我知道它提供了查询实体的快速方法,但我想做更多的事情(必须使用不同的实体)。这是一个场景,我有一个现有的普通 WCF 服务,它会进行一些计算并最终返回一个整数列表。

我将如何使用 oData 实现相同的 WCF 服务。

阿图尔·苏雷卡

4

2 回答 2

1

我们出于同样的原因查看 OData,虽然似乎存在一些用于进行自定义处理的钩子,但我们也留下了相同的“逻辑去哪儿了?” 问题。在我看来,我们从 OData 格式和 WCF 数据服务框架中获得的任何价值都会随着时间的推移而迅速消失,因为框架似乎要求我们公开我们的原始数据源(在我们的例子中是通过 NHibernate 的 SQL Server)并且不提供以逻辑方式做任何真实世界的事情的方法。这不仅让我们很难看到如何将传统 WCF 上现有的 RPC 样式 SOAP 服务转移到这个平台上,而且还不清楚您将如何使用它来做任何事情,除了普通的 CRUD。我想说......唯一真正“只是一个 CRUD 应用程序”的真实世界应用程序

最后,我们抛弃了 oData 并使用了 ServiceStack,到目前为止,我们对它非常非常满意。

http://servicestack.net/

于 2013-07-03T17:43:58.030 回答
1

可以使用 WCF 数据服务中的上下文级服务方法/函数导入将自定义业务逻辑添加到 OData 端点。这允许您创建返回标量值、集合或可查询集合的方法。代码片段是从JayData.org复制的

[WebGet]
public Product[] GetCheapProducts()
{
    return this.CurrentDataSource
                        .Products
                        .OrderByDescending(p => p.Unit_Price)
                        .Take(5)
                        .ToArray();
}

[WebGet]
public IQueryable<Product> GetBeverages()
{
    return this.CurrentDataSource
                    .Products
                    .Where(p => p.Category.Category_Name == "Beverages");
}

[WebGet]
public int AddTwoNumbers(int a, int b) 
{
    return a + b;
}

如果您通过 ASP.NET Web API 发布 OData 端点,则称为 Action,您可以在实体集或实体级别定义它们。

public class YourController : ODataController
{
        [HttpPost]
        public string GetFirstArticleTitle([FromODataUri] int key, ODataActionParameters parameters) { 
            var contains = (string)parameters["contains"] ?? "";
            return db.Articles.Where(a => a.Category.Id == key && a.Title.Contains(contains)).Select(a => a.Title).FirstOrDefault() ?? " - ";
        }
}
于 2013-07-04T10:21:09.473 回答