【发布时间】:2011-12-01 19:29:07
【问题描述】:
我正在创建一个“队列管理器”服务,它的唯一职责是将工作项添加到队列中并从队列中删除工作项。我已将服务实现为单例,因为我必须处理一些独特的同步问题。每当需要新任务时,我都会创建一个新的 Task 对象,设置参数,然后将其发送到 QueueManager 服务并将其添加到 SQL 数据库中。 Task 对象此时被序列化到数据库中。当一个进程从 QueueManager 请求一个项目时,服务会找到下一个可用的工作项目并将其反序列化回一个 Task 对象——从那里它被返回给客户端。
从技术上讲,这很好用。但是,我不喜欢将所有类型的任务硬塞到一个 Task 对象中。工作项目的范围可以从复制文件到更新数据库。我必须向 Task 对象添加许多对许多其他任务类型没有任何意义的属性——它变得非常草率。我对如何解决这个问题的第一个想法是将 Task 实现为基类,然后让所有其他任务派生自 Task。这将允许我拥有诸如 CopyFileTask、UpdateDatabaseTask、DoLaundryTask 等工作项。然后我会将对象序列化到数据库并添加一列来告诉我类型是什么,以便我知道以后如何反序列化它。
我看到这样做的第一个问题是 WCF 服务只需要返回一个类型。这将需要服务将工作项(例如 CopyFileTask)向下转换为 Task。但是,我现在需要将它转换回它的真实类型,但客户端将不知道该类型是什么。
我可能没有很好地解释这一点。简而言之,我需要:
- 创建任何类型的工作对象
- 将其传递给 WCF 服务以将其存储在数据库中
- 调用 WCF 服务以获取新工作项(找到的任何内容)
- 将该工作项作为真实的(非强制转换)返回给客户端 对象
我的队列需要非常通用,因为许多其他应用程序正在添加和删除工作项。这是为大规模并行系统设计的,并将成为所有分布式工作项的中心。任何和所有的帮助和想法都将不胜感激。
谢谢,
斯科特
【问题讨论】:
-
一些想法 - 你能做一个 ITask 界面吗?或者,Task对象是否可以有一个实现ISerializable的成员变量“Details”?
标签: c# wcf serialization queue