2

我是 WCF 的新手(和一般的 .NET),所以如果这是常识,我深表歉意。

我正在设计一个 WCF 解决方案(目前使用实体框架来访问数据库)。我想从数据库中获取一组(可能非常大)数据,并将其返回给客户端,但由于性能问题,我不想一次通过网络对整个数据集进行序列化。

我想操作以将某种对象返回给客户端,该对象代表结果数据,我想在客户端处理该数据,能够前后导航并通过根据需要接线。

我不想编写大量客户端代码来单独找出哪些行符合我的搜索条件,然后在我可以提供帮助的情况下单独调用以获取每条记录。我试图让客户尽可能简单。

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

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() 等函数必须是单独的服务合同操作。我想我只是在寻找一种方法来做到这一点,而不必编写我自己的所有代码来缓存服务器上的结果,以某种方式持久化服务器端的数据集,在我的服务库中编写所有检索和导航代码等.我希望这大部分已经为我完成了。

看起来这将是一个非常普遍需要的功能。那么,这样的事情存在吗?

-乔

4

1 回答 1

4

不,这不是 WCF 的设计初衷。

在 WCF 中,非常基本的核心体系结构是您有一个客户端和一个服务器,只有 (XML-) 序列化数据在两者之间通过网络传输。

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

WCF并非旨在处理大量数据 - 它旨在处理单个消息(GetCustomerByID(42)等等)。由于 WCF 从一开始就被设计为与其他平台(非 .NET,也像 Java、Ruby 等)互操作,因此您绝对应该使用重量级的 .NET 特定类型DataSet——使用适当的对象。

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

从我在您的帖子中阅读的内容来看,您正在寻找的更多是“进程内”数据访问层 - 而不是服务级别。因此,如果您想继续走这条路,您应该结合实体框架研究存储库和工作单元模式。

更多信息:

于 2012-12-30T21:52:28.870 回答