以前はプロトタイププロジェクトでこれを行うことができましたが、現在プロジェクトに含まれている他のもので「実装」されているため、WCFがMSMQからメッセージを取得できるという点でいくつかの問題があります。 。
ソリューションは、「チーム」を持つように構成されています。各プロジェクトはこれを(ある程度)表しています。チームは、必要なプロジェクトにのみアクセスできます。
それで:
IncomingMessagingプロジェクト(「メッセージ」プロジェクトを参照)
これには、(「メッセージ」プロジェクト内の)独自のタイプの基本クラスから派生した具象クラスであるクラスが含まれます。基本クラスはすべて「メッセージ」プロジェクトにあります。例:
FirstReport -> FirstReportBase
SecondReport -> SecondReportBase
ThirdReport -> ThirdReportBase
各基本クラスは「MainBase」から派生しています。これは「メッセージ」プロジェクトにもあります。MainBaseはKnownTypes属性で装飾されており、すべての基本的な既知のタイプがあります。(FirstReportBase、SecondReportBaseなど...)
次に、「Messages」プロジェクトと「IncomingMessaging」プロジェクトを参照するWCFImplementation.Messagesプロジェクトがあります。WCFImplementation.Messagesプロジェクトには、MSMQへのWCFバインディングに使用される具象クラスがあります。実際の実装は次のようになります。
[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)の両方がインターフェイスでサービスの既知の型として装飾されているため、以前はプロトタイプで動作するようになりましたが、これは「緩い」型のプロジェクト構造でした。