列挙値を Web サービスに渡す方法
-
08-06-2019 - |
質問
私のジレンマは、基本的に、2 つのアプリケーション間で列挙をどのように共有するかということです。
ユーザーは、Web 上のフロントエンド アプリケーションを通じてドキュメントをアップロードします。このアプリケーションは、バックエンド アプリケーションの Web サービスを呼び出し、ドキュメントをそれに渡します。バックエンド アプリはドキュメントを保存し、行を 書類 テーブル。
文書タイプ (7 つの可能な文書タイプ: 請求書, 契約 など) はパラメータとして Web サービスに渡されます。 ドキュメントのアップロード 方法。問題は、このパラメータの型 (および可能な値) をどうすべきかということです。
両方のアプリケーションでこれらの値をハードコーディングする必要があるため、問題ないと思います。説明的な文字列 (請求書, 契約, 作業命令, 署名済みの作業注文).
を作成する方が良いアプローチかもしれません ドキュメントタイプ 最初のアプリケーションで列挙を行い、2 番目のアプリケーションでもそれを再現し、対応する整数値をそれらの間の Web サービスに渡しますか?
解決
私は .net についてしか話せませんが、ASP.net Web サービスがある場合は、それに列挙を直接追加できるはずです。
その後、クライアント アプリケーションで「Web 参照の追加」を使用すると、結果のクラスにその列挙型が含まれる必要があります。
しかし、これは私の頭の上からのものであり、私は過去にそれを行ったことがあると確信していますが、確実に言うことはできません。
他のヒント
単に読みやすさとデバッグを目的として、それらの間で整数を渡すことはお勧めしません。ログを調べていると、DocumentType=4 の 500 件のエラーが見つかったとします。次に、どの DocumentType が 4 であるかを調べなければなりません。または、バージョンの不一致が原因で、一方のアプリケーションが他方のアプリケーションには存在しない番号を参照している場合。
これはもう少しコードが多く、脳の静的型付けの部分を少し荒々しくこすりますが、HTTP 上のプロトコルでは、不透明な列挙よりも読みやすい文字列を支持するというのが一般的な知恵です。
私は引き続き内部で列挙を使用しますが、コンシューマーは数値自体ではなく名前のみを渡すことを期待します。
説明するための愚かな例:
public enum DocumentType
{
Invoice,
Contract,
WorkOrder,
SignedWorkOrder
}
[WebMethod]
public void UploadDocument(string type, byte[] data)
{
DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
.NET ページ/アプリケーションから Web サービスを使用している場合は、サービスを使用しているプロジェクトに Web 参照を追加すると、列挙にアクセスできるようになります。
.NET to .NET SOAP を使用していない場合でも、両方のエンドポイントが WSDL を使用していれば、列挙子を定義できます。
<s:simpleType name="MyEnum">
<s:restriction base="s:string">
<s:enumeration value="Wow"/>
<s:enumeration value="This"/>
<s:enumeration value="Is"/>
<s:enumeration value="Really"/>
<s:enumeration value="Simple"/>
</s:restriction>
</s:simpleType>
これをクライアント言語で同等の enum に解析するのは、WSDL -> プロキシ ジェネレーター ツールの役割になります。
使用しないのにはかなりの理由があります enum
そのようなインターフェイス境界上にあります。考慮する デアさんの投稿 件名に。
VS.net の「Web 参照の追加」ではなく「サービス参照の追加」を使用すると、列挙名だけでなく実際の列挙値も表示されることに気付きました。2.0 クライアントと 3.5 クライアントの両方をサポートする必要があるため、これは非常に面倒です。結局、2.0 で生成された Web サービス プロキシ コードにアクセスし、変更を加えるたびに列挙値を手動で追加する必要があります。