【问题标题】:Is there an easier way to create a WCF/OData Data Service Query Provider?有没有更简单的方法来创建 WCF/OData 数据服务查询提供程序?
【发布时间】:2013-03-18 18:45:49
【问题描述】:

我有一个类似于以下的简单小数据模型:

InventoryContext {

IEnumerable<Computer> GetComputers()

IEnumerable<Printer> GetPrinters()

}

计算机 {

public string ComputerName { get; set; }

public string Location { get; set; } }

打印机 {

public string PrinterName { get; set; }

public string Location { get; set; }

}

结果来自非 SQL 源,因此该数据并非来自连接到数据库的实体框架。

现在我想通过 WCF OData 服务公开数据。到目前为止,我发现这样做的唯一方法是创建自己的数据服务查询提供程序,根据此博客教程:

http://blogs.msdn.com/alexj/archive/2010/01/04/creating-a-data-service-provider-part-1-intro.aspx

...这很棒,但似乎是一项相当复杂的工作。提供程序的代码将比我的整个数据模型长 4 倍,以生成所有资源集和属性定义。

在实体框架和从零开始编写自己的数据源之间是否有类似通用提供程序的东西?也许是某种方式来构建对象数据源或其他东西,这样神奇的 WCF 独角兽就可以拿起我的数据并在没有明确编码提供程序的情况下骑到日落?

【问题讨论】:

  • 有一种更简单的方法可以询问是否更简单。 :)

标签: c# wcf dynamic-data odata


【解决方案1】:

您可以使用所谓的“反射提供者”。这假设您有一个返回 IQueryable 的属性(或许多属​​性)(T 是您的实体类型)。 观看此视频,了解简单的“操作方法”以帮助您入门。 http://msdn.microsoft.com/en-us/data/cc745968.aspx

【讨论】:

    【解决方案2】:

    您可以使用内置的Reflection Provider

    将以下内容添加到您的 InventoryContext:

    IQueryable<Computer> Computers { get { return GetComputers().AsQueryable(); } }
    IQueryable<Printer> Printers { get { return GetPrinters().AsQueryable(); } }
    

    并按如下方式修改实体(您需要在项目中添加对System.Data.Services.Client 的引用):

    using System.Data.Services.Common;
    
    [DataServiceKey("ComputerName")]
    public class Computer 
    {
        public string ComputerName { get; set; }
        public string Location { get; set; } }
    }
    
    [DataServiceKey("PrinterName")]
    public class Printer
    {
        public string PrinterName { get; set; }
        public string Location { get; set; } }
    }
    

    完成后,只需将数据服务指向 InventoryContext,如下所示:

    public InventoryDataService : DataService<InventoryContext>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
            config.UseVerboseErrors = true;         
        }
    }
    

    这应该就是你需要做的。 InventoryContext 需要有一个无参数的构造函数。

    【讨论】:

      【解决方案3】:

      您可以使用 WCF 数据服务工具包。

      它最初是由一群来自 Microsoft 的人编写的,它允许以非常灵活的方式创建不基于实体框架的 OData 服务。

      Jonathon Carter 去年在 mix 上做了一个出色的演示,围绕 Mongo DB 包装了 OData 服务。

      http://channel9.msdn.com/events/MIX/MIX11/FRM16

      代码也可以在 codeplex http://wcfdstoolkit.codeplex.com/

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-11-18
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        相关资源
        最近更新 更多