私の前の質問を参照すると、話は、私がsvcutilで生成されたクラスをたくさん持っているという事実から始まります。それらは外部WSDLから生成されます。どうぞ:
最初のリクエストクラス:
public partial class getcarsRequest
{
[System.ServiceModel.MessageHeaderAttribute(Namespace = "http://svc.datadomains.com/revision123_2/")]
public CarsServiceApp.RequestHeader Header;
[System.ServiceModel.MessageBodyMemberAttribute(Name = "getcarsRequest", Namespace = "carinfo", Order = 0)]
public CarsServiceApp.getcars MessageWrap;
public getcarsRequest()
{
}
public getcarsRequest(CarsServiceApp.RequestHeader Header, CarsServiceApp.getcars getcarsRequest1)
{
this.Header = Header;
this.MessageWrap = getcarsRequest1;
}
}
public partial class getcars
{
private MessageType messageField;
private MessageDataGetcarsRequest messageDataField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public MessageType Message
{
get
{
return this.messageField;
}
set
{
this.messageField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public MessageDataGetcarsRequest MessageData
{
get
{
return this.messageDataField;
}
set
{
this.messageDataField = value;
}
}
}
public partial class MessageDataGetcarsRequest
{
private AppDataGetcarsRequest appDataField;
private AppDocumentType appDocumentField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public AppDataGetcarsRequest AppData
{
get
{
return this.appDataField;
}
set
{
this.appDataField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public AppDocumentType AppDocument
{
get
{
return this.appDocumentField;
}
set
{
this.appDocumentField = value;
}
}
}
public partial class AppDataGetcarsRequest
{
private string addressField;
private int codeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public address address
{
get
{
return this.addressField;
}
set
{
this.addressField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public int code
{
get
{
return this.codeField;
}
set
{
this.codeField = value;
}
}
}
2番:
public partial class getdriversRequest
{
[System.ServiceModel.MessageHeaderAttribute(Namespace = "http://svc.datadomains.com/revision123_2/")]
public carsServiceApp.RequestHeader Header;
[System.ServiceModel.MessageBodyMemberAttribute(Name = "getdriversRequest", Namespace = "driverinfo", Order = 0)]
public carsServiceApp.getdrivers MessageWrap;
public getdriversRequest()
{
}
public getdriversRequest(carsServiceApp.RequestHeader Header, carsServiceApp.getdrivers getdriversRequest1)
{
this.Header = Header;
this.MessageWrap = getdriversRequest1;
}
}
public partial class getdrivers
{
private MessageType messageField;
private MessageDataGetdriversRequest messageDataField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public MessageType Message
{
get
{
return this.messageField;
}
set
{
this.messageField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public MessageDataGetdriversRequest MessageData
{
get
{
return this.messageDataField;
}
set
{
this.messageDataField = value;
}
}
}
public partial class MessageDataGetdriversRequest
{
private AppDataGetdriversRequest appDataField;
private AppDocumentType appDocumentField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public AppDataGetdriversRequest AppData
{
get
{
return this.appDataField;
}
set
{
this.appDataField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public AppDocumentType AppDocument
{
get
{
return this.appDocumentField;
}
set
{
this.appDocumentField = value;
}
}
}
public partial class AppDataGetdriversRequest
{
private string nameField;
private int customerCodeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public name name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public int customerCode
{
get
{
return this.customerCodeField;
}
set
{
this.customerCodeField = value;
}
}
}
これは、svcutilによって生成された2つのエンティティです。この2つのように、ほとんどの基礎となるAppData
プロパティによってのみ異なる別のエンティティがあります。一部のフィールドの名前を変更する生の生成ファイルを準備するPowerShellスクリプトを作成しましたが、これだけではすべての作業を完了できません。
クラスを統一するにはどうすればよいですか?パラメータ化されたインターフェイスを使用する必要があるようです...リクエストが正しいことを確認したり、リクエストを最初から作成したりするなど、一般的な便利な機能を考案するには、統合されたクラス構造が必要です。
よろしくお願いします!私の脳はそのことについて沸騰しています。
質問編集#1
さて、皆さん、これが私が欲しいものです。サービスメソッドの要求が正しいかどうかを確認したいとします。一部のリクエストのAppData
プロパティがnullでない場合は、そのリクエストが正しいと見なす必要があります。実際には、そのようなチェックのためにいくつかの一般的なクラスのメソッドを持っている方が良いでしょう。AppData
しかし、リクエストクラスに異なるプロパティタイプがある場合、どうすればそのメソッドを作成できますか?
生成された2つのクラスを見て、各AppDataプロパティへの架空のパスを描画してみましょう。
ファーストクラスの場合、getcarsRequestがあります(括弧内には適切なクラスタイプがあります)。
request(getcarsRequest)-> MessageWrap(getcars)-> MessageData(MessageDataGetcarsRequest)-> AppData(AppDataGetcarsRequest)
2つ目は、次のパスです。
request(getdriversRequest)-> MessageWrap(getdrivers)-> MessageData(MessageDataGetdriversRequest)-> AppData(AppDataGetdriversRequest)
では、どうすればそれらを再考案して、いくつかの汎用インターフェースに減らすことができるでしょうか?その2つのクラスに適切で共通のインターフェースがあれば、いくつか書くことができますCheckRequest(IRequest<T> request)
。
ここである程度明確になることを願っています。アドバイス/文章は大歓迎です。ご不明な点がございましたら、お気軽にお持ちください。