2011-12-01 57 views
3

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

从技术上讲,这个伟大的工程。但是,我不喜欢不得不将任何类型的任务都放到Task对象中。工作项目的范围可以从复制文件到更新数据库。我必须向Task对象添加很多属性,这对许多其他任务类型来说并不意味着什么 - 它变得相当sl。。我首先想到如何解决这个问题,将Task作为基类实现,然后让所有其他任务从Task派生。这将允许我有CopyFileTask,UpdateDatabaseTask,DoLaundryTask等工作项。然后,我会将该对象序列化到数据库,并添加一个列来告诉我该类型是什么,以便我知道如何在稍后反序列化它。

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

我可能没有做好解释这一点。概括地说,我需要:

  • 创建任何类型的工作对象
  • 它传递给WCF服务以存储在一个数据库
  • 调用WCF服务来获得一个新的工作项目(任何它认定)
  • 有工作项目重新调整到客户端作为一个真正的(非铸造) 对象

我的队列必须是非常通用的,因为许多其他应用程序添加和删除工作项。这是为大规模并行系统而设计的,它将成为所有分布式工作项目的中心。任何和所有的帮助和想法将会大受欢迎。

感谢,

斯科特

+0

一些想法 - 你可以创建一个ITask接口吗?或者,Task对象是否可以有一个实现ISerializable的成员变量“Details”? –

回答

0

这实际上是使用NoSQL数据库一样CouchDB完美的场景。如果您必须存储未绑定到硬模式但基于更多文档(或者您的情况)基于任务的数据,则此类数据库会受到影响。你用一种类型使它们变得不可靠,但底层结构不受约束。

CouchDB是一个选项吗?然后结帐relax - CouchDB的.NET API。

如果没有,只是像存储类型的基本数据,创建,...(基本数据,你需要设置一个查询来获取在队列中的下一个任务)中单独列在您的SQL任务表。然后你有一个名为细节或工作项的列,它将任务的详细信息保存为XML。