C# 构建队列服务-序列化任务以供以后使用

C# 构建队列服务-序列化任务以供以后使用,c#,wcf,serialization,queue,C#,Wcf,Serialization,Queue,我正在创建一个“队列管理器”服务,它的唯一职责是向队列中添加工作项,并从队列中删除工作项。我将该服务作为一个单例实现,因为我必须处理一些独特的同步问题。每当需要新任务时,我都会创建一个新任务对象,设置参数,然后将其发送到QueueManager服务,并将其添加到SQL数据库中。此时任务对象被序列化到数据库。当流程从QueueManager请求一个项时,服务会找到下一个可用的工作项并将其反序列化回任务对象,然后返回给客户端 从技术上讲,这很有效。但是,我不喜欢把所有类型的任务都塞进任务对象中。工作

我正在创建一个“队列管理器”服务,它的唯一职责是向队列中添加工作项,并从队列中删除工作项。我将该服务作为一个单例实现,因为我必须处理一些独特的同步问题。每当需要新任务时,我都会创建一个新任务对象,设置参数,然后将其发送到QueueManager服务,并将其添加到SQL数据库中。此时任务对象被序列化到数据库。当流程从QueueManager请求一个项时,服务会找到下一个可用的工作项并将其反序列化回任务对象,然后返回给客户端

从技术上讲,这很有效。但是,我不喜欢把所有类型的任务都塞进任务对象中。工作项的范围从复制文件到更新数据库。我必须向Task对象添加许多属性,这些属性对许多其他任务类型都没有任何意义——它变得非常松散。关于如何解决这个问题,我的第一个想法是将Task作为基类实现,然后让所有其他任务都从Task派生。这将允许我拥有诸如CopyFileTask、UpdateDatabaseTask、DoLaundryTask等工作项。然后,我会将对象序列化到数据库中,并添加一列来告诉我类型是什么,以便我知道以后如何反序列化它

我认为这样做的第一个问题是WCF服务只需要返回一种类型。这需要服务将工作项(例如CopyFileTask)向下转换为任务。然而,我现在需要将它转换回它的真实类型,但是客户端将不知道该类型是什么

我可能解释得不好。简而言之,我需要:

  • 创建任何类型的工作对象
  • 将其传递给WCF服务以将其存储在数据库中
  • 调用WCF服务以获取新工作项(找到的任何内容)
  • 将该工作项作为真实(非铸造)返回给客户机 反对
我的队列需要非常通用,因为许多其他应用程序正在添加和删除工作项。这是为大规模并行系统设计的,将成为所有分布式工作项的中心。我们将非常感谢您提供的任何帮助和想法

谢谢


Scott

这实际上是使用NOSQL数据库的完美场景,如。如果您必须存储未绑定到硬模式但更基于文档(或在您的情况下)任务的数据,那么这样的数据库是非常有用的。您可以按类型将其取消语言化,但基础结构未绑定

CouchDB是一种选择吗?然后签出-CouchDB的.NETAPI


如果没有,只需存储基本数据,如type、created、。。。(设置查询以获取队列中的下一个任务所需的基本数据)在SQL任务表中的不同列中。然后有一个名为details或workitem的列,它以XML的形式保存任务的详细信息。

您看过
ServiceKnownTypeAttribute
了吗?请查看此MSDN上的示例代码:

一些想法-你能制作一个ITask界面吗?或者,任务对象是否可以具有实现ISerializable的成员变量“Details”?