最初に長い質問で申し訳ありません。より短い質問を考え出したいと思いますが、これは私が提供できる最も単純なバージョンであり、私の主張を明確に説明できます.
複数のサービスを提供する必要があるラッパーサービスをクライアントに提供しようとしています。その背後にあるアイデアは、複数の呼び出しを 1 つの呼び出しに減らし、他の関連付けられたオブジェクトを含む単一のオブジェクトを返すことです。私の要点を説明するために、次の例を挙げましょう。
次のサービスがあるとします。
- MyCompany.Services.Donation
- MyCompany.Services.Payment
- MyCompany.Services.PartialPayment
通常、クライアントは Donation サービス (donationID を使用) にクエリを実行して寄付情報を取得し、取得した寄付情報を使用して Payment サービスにクエリを実行し、支払い関連の詳細を取得する必要があります。 、特定の寄付者のすべての寄付情報を取得するには、PartialPayment サービスにクエリを実行する必要があります。
クライアントがこれを行う代わりに、donationID を単一のパラメーターとして受け入れ、次のようなクラスを返すラッパー サービスを提供します。
[DataContract(Namespace = "http://MyCompany.Services.DonationDetail")]
public class DonationDetail
{
[DataMember]
public MyCompany.Services.Donation.Record donationRecord;
[DataMember]
public PaymentDetail paymentDetail;
}
[DataContract(Namespace = "http://MyCompany.Services.DonationDetail")]
public class PaymentDetail
{
[DataMember]
public MyCompany.Services.Payment.Record paymentRecord;
[DataMember]
public List<MyCompany.Services.PartialPayment.Record> partialPayments;
}
したがって、DonationDetail レコードのインスタンスは、その寄付に関連するすべての情報を返す必要があります。
ラッパーサービスを使用してクライアントに渡すクラスはすべてラッパーサービスの一部になり、クライアントはサービス参照を使用せずに取得した対応するタイプでそれらをすぐに使用できないため、ラッパーサービスでこれらの個々のサービス DLL を使用すると問題が発生します。ある型を別の型に変換するためのカスタム構築メソッドを作成する - それらは同じオブジェクトですが。元の名前空間のクラスを参照する代わりに、サービスは上記のクラスに対して次のようなクラスを使用します。
- DonationDetail.Record (寄付記録 - MyCompany.Services.Donation.Record を期待します)
- DonationDetail.Record1 (支払いレコード - MyCompany.Services.Payment .Record が必要です)
- DonationDetail.Record2 (PartialPayment レコード - MyCompany.Services.PartialPayment.Record を期待します)
カスタムコンストラクターなしでそのようなインターフェースを提供する方法はありますか? では、MyCompany.Services.PartialPayment WCF サービスに "PartialPayment" 名前空間を使用する場合、DonationDetail がラッパー サービスを介して取得された後、以下のことを行うことができますか?
PartialPayment.Record partialPayment = dDetailObj.paymentDetail.partialPayments[0];
*: それが問題の原因でない限り、サービス参照を使用しない理由を聞かないでください。そのオプションは、この時点で他の問題を引き起こすためです)