通过WCF访问数据而不序列化整个事物?

时间:2012-12-30 21:49:06

标签: asp.net wcf entity-framework

我在WCF(以及一般的.NET)上都很新,所以如果这是常识,我会道歉。

我正在设计一个WCF解决方案(目前使用Entity Framework来访问数据库)。我想从数据库中获取一个(可能是非常大的)数据集,并将其返回给客户端,但由于性能问题,我不想一次性通过线路序列化整个数据集。

我想操作将某种对象返回给表示结果数据的客户端,我想在客户端上处理这些数据,能够向后导航并转发并检索实际数据根据需要通过电线传输数据。

我不想写很多客户端代码来单独找出哪些行符合我的搜索条件,然后单独调用以获取每条记录,如果我能帮助它的话。我试图让客户尽可能简单。

理想情况下,我想编写类似于以下伪代码的客户端代码:

Reference1.Service1Client MyService = new Reference1.Service1Client("Service1");

DelayedDataSet<MyRecordType> MyResultSet = MyService.GetAllCustomers();

MyResultSet.First();

while (!MyResultSet.Eof)
{
    Console.Writeline(MyResultSet.CurrentRecord().CUSTFNAME + " " + MyResultSet.CurrentRecord().CUSTLNAME);
    Console.Writeline("Press Enter to see the next customer");
    Console.Readline();
    MyResultSet.Next();
}

当然,DelayedDataSet是我刚才编写的,我希望它能存在于.NET中。

对MyService.GetAllCustomers()的调用将返回此DelayedDataSet对象,实际上不包含实际记录。在调用CurrentRecord()之前,实际数据不会通过线路传输。 Next()和Previous()只需更新服务器端的游标即可指向相应的记录。我不希望客户端对数据库或实体框架有任何直接的可见性。

我猜测我编写代码的方式可能无法在WCF上运行,而且像CurrentRecord(),Next(),First()等函数必须是单独的服务契约操作。我想我只是想找到一种方法来做到这一点,而不必编写我自己的代码来缓存服务器上的结果,不知何故坚持数据集服务器端,在我的服务库中写入所有检索和导航代码,等等我希望大部分已经为我完成了。

这似乎是一个非常常见的功能。那么,这样的事情是否存在?

-Joe

1 个答案:

答案 0 :(得分:4)

不,那不是WCF的目的。

在WCF中,最基本的核心架构是你有一个客户端和一个服务器,除了(XML-)序列化数据之外什么都没有通过网络传输。

WCF是 远程过程调用方法,或某种远程对象机制 - 有客户端和服务器之间的连接,但序列化消息符合两者之间定义的服务(和数据)合同。

WCF 旨在处理大量数据 - 它旨在处理单个邮件(GetCustomerByID(42)等)。由于WCF设计为与其他平台(非.NET,也像Java,Ruby等)可互操作,因此你绝对应该使用重型-weight .NET特定类型,如DataSet - 使用适当的对象。

此外,由于WCF最终将所有内容序列化为XML并通过网络发送,因此传递的所有数据必须在XML模式中表达 - 这不包括接口和/或泛型。

从我在您的帖子中阅读的内容来看,您正在寻找的更多是一个&#34; in-proc&#34;数据访问层 - 不是服务级别。因此,如果您想继续沿着这条路走下去,您应该结合Entity Framework调查存储库和工作单元模式。

更多信息: