WCF数据服务 - 我在哪里编写业务逻辑

时间:2013-07-03 14:00:07

标签: wcf wcf-data-services odata

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

我是oData的新手,虽然我知道它提供了查询实体的快捷方式,但我想做更多的事情(必须与不同的实体一起玩)。这是一个场景,我有一个现有的正常WCF服务,它做了一些计算&最后返回一个整数列表。

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

Atul Sureka

2 个答案:

答案 0 :(得分:1)

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

结束,我们抛弃oData并使用ServiceStack,到目前为止我们非常非常满意。

http://servicestack.net/

答案 1 :(得分: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() ?? " - ";
        }
}