こんにちは、メソッドを実行するクラス ライブラリがあり、メソッド呼び出しのパラメーターとして使用するさまざまなクラスが多数あります... このクラス ライブラリの wcf ラッパーを作成しています。クラスライブラリを変更する権限がありません。
今私の質問は、これらのクラスをデータ契約/データメンバーとして簡単に公開するにはどうすればよいですか?
これらのメソッドに必要な約100の異なるクラスがあります。
ありがとう
こんにちは、メソッドを実行するクラス ライブラリがあり、メソッド呼び出しのパラメーターとして使用するさまざまなクラスが多数あります... このクラス ライブラリの 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 内でクラスを使用するだけです。
詳細な説明については、この関連する質問を確認してください。DataContract を使用する場合と使用しない場合、およびその結果について説明しています。
試したことはありませんが、部分クラスと部分メソッドを使用して属性を追加してみてください。