24

私のジレンマは、基本的に、2 つのアプリケーション間で列挙を共有する方法です。

ユーザーは、Web 上のフロントエンド アプリケーションを介してドキュメントをアップロードします。このアプリケーションは、バックエンド アプリケーションの Web サービスを呼び出し、ドキュメントをそれに渡します。バックエンド アプリはドキュメントを保存し、ドキュメントテーブルに行を挿入します。

ドキュメント タイプ (7 つの可能なドキュメント タイプ: InvoiceContractなど) は、パラメーターとして Web サービスのUploadDocumentメソッドに渡されます。問題は、このパラメーターの型 (および可能な値) をどうするかということです。

これらの値は両方のアプリケーションでハードコーディングする必要があるため、説明的な文字列 ( InvoiceContractWorkOrderSignedWorkOrder ) を使用しても問題ないと思います。

最初のアプリケーションでDocumentTypes列挙を作成し、2 番目のアプリケーションでもそれを再現してから、対応する整数値をそれらの間の Web サービスに渡す方がよい方法でしょうか?

4

8 に答える 8

6

単純に読みやすさとデバッグの目的で、それらの間で整数を渡すことはお勧めしません。ログを調べていて、DocumentType=4 の 500 個のエラーがたくさんあるとします。ここで、どの DocumentType が 4 であるかを調べる必要があります。または、バージョンの不一致が原因で、アプリケーションの 1 つが他のアプリケーションに存在しない番号を参照している場合。

これはもう少しコードが多く、頭脳の静的型付けの部分を少し荒削りにしていますが、HTTP 上のプロトコルでは、不透明な列挙よりも読みやすい文字列を支持するという知恵が得られています。

于 2008-08-04T23:54:12.817 に答える
5

私は引き続き内部的に列挙を使用しますが、消費者は数値自体ではなく、名前だけを渡すことを期待します。

説明するためのばかげた例:

public enum DocumentType
{
  Invoice,
  Contract,
  WorkOrder,
  SignedWorkOrder
}

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
于 2008-08-05T00:12:35.370 に答える
3

.NETから.NETSOAPを使用していない場合でも、両方のエンドポイントが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>

それをWSDL->プロキシジェネレータツールに任せて、クライアント言語で同等の列挙型に解析します。

于 2008-09-07T23:38:16.163 に答える
3

私は .net についてしか話せませんが、ASP.net Web サービスがあれば、それに列挙を直接追加できるはずです。

その後、クライアント アプリケーションで「Web 参照の追加」を使用すると、結果のクラスにその列挙型が含まれる必要があります。

しかし、これは私の頭の上からのものです。過去にやったことがあると確信していますが、確かなことは言えません。

于 2008-08-04T23:56:54.403 に答える
3

.NET では、列挙値は (既定で) 名前を付けて xml にシリアル化されます。複数の値 ( flags )を持つことができるインスタンスの場合、値の間にスペースを入れます。これは、列挙にスペースが含まれていないため機能するため、文字列を分割することで値を再度取得できます (つまり、lubos の例を使用した「Invoice Contract SignedWorkOrder」)。

XmlEnumAttributeを使用するか、WCF を使用する場合はEnumMember属性を使用して、asp.net Web サービスの値のシリアル化を制御できます。

于 2008-08-05T01:26:14.550 に答える
3

.NET ページ/アプリケーションから Web サービスを使用している場合、サービスを使用しているプロジェクトに Web 参照を追加すると、列挙にアクセスできるようになります。

于 2008-08-05T01:34:40.900 に答える
3

enumそのようなインターフェイス境界で s を使用しないことには、いくつかのかなりの理由があります。この件に関するDare の投稿を検討してください。

于 2008-09-08T12:35:03.563 に答える
0

VS.netの「Web参照の追加」ではなく「サービス参照の追加」を使用すると、実際の列挙値と列挙名が表示されることに気付きました。2.0と3.5の両方のクライアントをサポートする必要があるので、これは本当に面倒です。変更を加えるたびに、2.0で生成されたWebサービスプロキシコードにアクセスし、列挙値を手動で追加する必要があります。

于 2008-09-07T23:21:15.860 に答える