我正在创建一个“队列管理器”服务,它的唯一职责是将工作项添加到队列中以及从队列中删除工作项。我已经将该服务实现为单例,因为我必须处理一些独特的同步问题。每当需要新任务时,我都会创建一个新任务对象,设置参数,然后将其发送到 QueueManager 服务并将其添加到 SQL 数据库中。 Task 对象此时被序列化到数据库中。当一个进程从 QueueManager 请求一个项目时,该服务会找到下一个可用的工作项目并将其反序列化回一个 Task 对象——从那里它被返回给客户端。
从技术上讲,这很有效。但是,我不喜欢将所有类型的任务硬塞进一个 Task 对象中。工作项的范围可以从复制文件到更新数据库。我必须向 Task 对象添加很多属性,这些属性对许多其他任务类型没有任何意义——它变得非常草率。关于如何解决这个问题,我的第一个想法是将 Task 实现为基类,然后让所有其他任务从 Task 派生。这将允许我拥有 CopyFileTask、UpdateDatabaseTask、DoLaundryTask 等工作项。然后我会将对象序列化到数据库并添加一列来告诉我类型是什么,这样我就知道以后如何反序列化它。
我看到这样做的第一个问题是 WCF 服务只需要返回一种类型。这将需要服务将工作项(例如 CopyFileTask)向下转换为 Task。但是,我现在需要将其转换回其真实类型,但客户端将不知道该类型是什么。
我可能没有很好地解释这一点。简而言之,我需要:
- 创建任何类型的工作对象
- 将其传递给 WCF 服务以将其存储在数据库中
- 调用 WCF 服务以获取新工作项(它找到的任何内容)
- 将该工作项目作为真实(非 Actor )返回给客户 对象
我的队列需要非常通用,因为许多其他应用程序正在添加和删除工作项。这是为大型并行系统设计的,将成为所有分布式工作项的中心。我们将不胜感激任何帮助和想法。
谢谢,
斯科特
最佳答案
你看过 ServiceKnownTypeAttribute
了吗?查看此 MSDN 上的示例代码:
http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx
关于c# - 构建队列服务 - 序列化任务供以后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347136/