【问题标题】:WCF data service - where would I write business logicWCF 数据服务 - 我将在哪里编写业务逻辑
【发布时间】:2013-07-03 14:00:06
【问题描述】:

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

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

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

阿图尔·苏雷卡

【问题讨论】:

    标签: wcf wcf-data-services odata


    【解决方案1】:

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

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

    http://servicestack.net/

    【讨论】:

      【解决方案2】:

      可以使用 WCF 数据服务中的上下文级服务方法/函数导入将自定义业务逻辑添加到 OData 端点。这允许您创建返回标量值、集合或可查询集合的方法。代码sn -p 复制自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() ?? " - ";
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 2013-06-12
        相关资源
        最近更新 更多