我以前可以通过原型项目做到这一点,但是因为现在它正在与项目中包含的其他内容一起“实施”,所以在 WCF 能够从 MSMQ 获取消息方面我遇到了一些问题.
解决方案的结构是我们有“团队”。每个项目都代表了这一点(在某种程度上)。团队只能访问他们需要的项目。
所以:
IncomingMessaging 项目(参考“消息”项目)
这包含的类是从其自身类型的基类(在“消息”项目中)派生的具体类。基类都在“消息”项目中。例子:
FirstReport -> FirstReportBase
SecondReport -> SecondReportBase
ThirdReport -> ThirdReportBase
每个基类都派生自“MainBase”。这也存在于“消息”项目中。MainBase 已使用 KnownTypes 属性进行修饰,并具有所有基本已知类型。(FirstReportBase、SecondReportBase 等...)
然后我有一个 WCFImplementation.Messages 项目,它引用了“Messages”和“IncomingMessaging”项目。WCFImplementation.Messages 项目有一个具体的类,用于将 WCF 绑定到 MSMQ,实际实现如下:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class InboundMessagingService : IInboundMessagingService
{
[OperationBehavior(TransactionScopeRequired = true)]
public void ProcessIncomingMessage(MsmqMessage<MainBase> msg) { ... }
}
IInboundMessagingService 具有 ServiceContract 属性,并且还具有所有基本类型的 ServiceKnownType 属性
到目前为止和我在一起?
然后我有一个简单的控制台应用程序项目来托管服务。请注意,此时我已将 FirstReport 消息发送到队列:
FirstReport fr = new FirstReport(....);
控制台应用程序正在运行,但服务出现故障。它无法读取队列中的消息!(毒药信息)
我错过了什么?IInboundMessagingService 的接口是否必须用具体的类进行装饰?我不能只使用基类吗?
我之前让它与原型一起工作,因为我将具体(FirstReport)和基类(FirstReportBase)都装饰为接口中的服务已知类型,但这是一个“松散”类型的项目结构