私が変更できないライブラリ内のクラス用のWCFデータコントラクト
-
27-10-2019 - |
質問
こんにちは、メソッドを実行し、メソッドコールにパラメーターとして使用するさまざまなクラスがあるクラスライブラリがあります...このクラスライブラリのWCFラッパーを作成しています。しかし、クラスライブラリを変更する許可はありません。
さて、私の質問は、これらのクラスをデータ契約/データメンバーとして簡単に公開するにはどうすればよいですか?
これらの方法に必要な約100の異なるクラスがあります。
ありがとう
解決
ライブラリを本当に変更できない場合は、WCFを介してクラスを公開する唯一の選択は、各メソッドのラッパーオブジェクトを作成することだと思います。このタスクのコードジェネレーターを書くことを検討します。
必要なタイプメタデータ情報を取得するために公開したいアセンブリ内のタイプのセットを振り返ることができます。
T4テンプレート(VS 2008以降の一部)や T4ツールボックス コードジェネレーターを作成してコードを作成します。発電機が完了したら、ライブラリが変更された場合、再び簡単に再実行できます。また、コードジェネレーターを更新して再実行するバグを簡単に修正することもできます。
私が完全性についてのみ言及しているが、いくつかのとげのある問題がある他のオプションは、問題のコードを分解してパッチすることです。 Ildasmのようなものを使用して、アセンブリのILを捨て、必要なWCF属性を追加してからILASMで再組み立てできます。ただし、プロセスはエラーが発生しやすい場合があります。アセンブリが変更されると、プロセスをやり直す必要がある場合はいつでも、アセンブリのIPを所有する人に応じて法的問題が発生する可能性があり、アセンブリを再署名する必要があります。強い名前のアセンブリである必要がある場合、異なる暗号化証明書を使用する可能性があります。
* 編集 *
要求されたラッパーコードサンプル:
public class ToWrap {
public String Name { get; set; }
public String Address { get; set; }
}
[DataContract]
public class Wrapper {
private ToWrap _wrapped;
// constructor for WCF marshalling
public Wrapper() {
_wrapped = new ToWrap();
}
public Wrapper(ToWrap wrapped) {
_wrapped = wrapped;
}
[DataMember]
public String Name {
get { return _wrapped.Name; }
set { _wrapped.Name = value; }
}
[DataMember]
public String Address {
get { return _wrapped.Address; }
set { _wrapped.Address = value; }
}
}
他のヒント
これらのクラスが[Serializable]としてマークされている場合、WCF ServiceContractで使用できますが、そうでない場合は簡単な方法がありません。同じプロパティを持つ新しいクラスのセットを作成する以外に選択肢はありません。その後、ライブラリの機能の1つを呼び出すたびに、それらをライブラリの同等物にプロパティごとにコピーします。
.NET 3.5 SP1から始めて、DataContractを指定する必要はなくなりました。 ServiceContract内のクラスを使用するだけです。
完全な説明については、チェックしてください この関連する質問, 、いつ使用するか、いつデータコントラクトと結果を使用しないかについて説明します。
私はそれを試したことはありませんが、部分的なクラスと部分的な方法を使用して属性を追加してみることができます。