有没有更简单的方法来创建WCF / OData数据服务查询提供程序?

时间:2010-05-27 13:41:37

标签: c# wcf dynamic-data odata

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

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倍,以生成所有资源集和属性定义。

在Entity Framework之间是否存在类似通用提供程序的东西,从零开始编写自己的数据源?也许某种方式来构建对象数据源或其他东西,以便神奇的WCF独角兽能够获取我的数据并骑行到日落而不必明确地编码提供者?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用内置的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需要有一个无参数构造函数。

答案 2 :(得分:0)

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

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

乔纳森·卡特去年在混音中做了一个很棒的演示,包括围绕Mongo DB的OData服务。

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

该代码也可用于codeplex http://wcfdstoolkit.codeplex.com/

希望这有帮助。