我想知道在哪里可以使用WCF数据服务(Odata)编写自定义业务逻辑。
我是oData的新手,虽然我知道它提供了查询实体的快捷方式,但我想做更多的事情(必须与不同的实体一起玩)。这是一个场景,我有一个现有的正常WCF服务,它做了一些计算&最后返回一个整数列表。
如何使用oData实现相同的WCF服务。
Atul Sureka
答案 0 :(得分:1)
我们看OData是出于同样的原因,虽然似乎有一些钩子可以进行自定义处理,但我们也留下了相同的“逻辑在哪里?”题。在我看来,无论我们从OData格式和WCF数据服务框架获得什么价值都会随着时间的推移而迅速侵蚀,因为框架似乎要求我们公开我们的原始数据源(在我们的例子中是SQL Server通过NHibernate)并且不提供以任何方式做任何现实世界的逻辑方式。这不仅使我们很难看到我们如何将现有的RPC样式SOAP服务在传统的WCF上移动到这个平台上,而且还不清楚如何使用它来做任何事情,而不是vanilla CRUD。我想说...真正“只是一个CRUD应用程序”的唯一真实应用程序是一个应用程序,其中SQL Server Management Studio将成为用户可接受的UI ...换句话说,“只是CRUD”应用程序存在。
结束,我们抛弃oData并使用ServiceStack,到目前为止我们非常非常满意。
答案 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() ?? " - ";
}
}