2008-08-04 42 views
20

Tình trạng khó xử của tôi về cơ bản là cách chia sẻ một điều tra giữa hai ứng dụng.Cách chuyển các giá trị được liệt kê sang một dịch vụ web

Người dùng tải lên tài liệu thông qua ứng dụng giao diện người dùng trên web. Ứng dụng này gọi một dịch vụ web của ứng dụng back-end và chuyển tài liệu tới nó. Ứng dụng back-end lưu tài liệu và chèn một hàng vào bảng Tài liệu.

Các loại tài liệu (7 loại tài liệu có thể: Invoice, Hợp đồng vv) được thông qua như là một tham số để phương pháp UploadDocument các dịch vụ web. Câu hỏi đặt ra là, loại (và giá trị có thể) của tham số này nên là gì?

Vì bạn cần mã hóa các giá trị này trong cả hai ứng dụng, tôi nghĩ rằng đó là O.K. sử dụng một chuỗi mô tả (Invoice, Hợp đồng, WorkOrder, SignedWorkOrder).

Đây có phải là cách tiếp cận tốt hơn để tạo một điều kiện DocumentTypes trong ứng dụng đầu tiên và tái tạo nó trong ứng dụng thứ hai, sau đó chuyển giá trị số nguyên tương ứng cho dịch vụ web giữa chúng?

Trả lời

3

Tôi chỉ có thể nói về .net, nhưng nếu bạn có ASP.net Webservice, bạn sẽ có thể thêm một điều tra trực tiếp vào nó.

Khi bạn sau đó sử dụng "Add Web Reference" trong ứng dụng khách hàng của bạn, kết quả lớp nên bao gồm rằng enum

Nhưng đây là từ đỉnh đầu của tôi, tôi khá chắc chắn tôi đã thực hiện nó trong quá khứ, nhưng tôi không thể nói chắc chắn.

+0

'Thêm tham chiếu web' sẽ tạo ra enums, nhưng chỉ những tài liệu được tham chiếu trong một số phương pháp. Tôi có thể tự thêm enums vào tệp Reference.cs được tạo tự động và tất cả đều hoạt động tốt. Có lẽ đây là câu hỏi riêng biệt, nhưng có cách nào để có được 'Thêm tham chiếu web' để thêm tất cả các enums trong một assembly tham chiếu (nhưng không được sử dụng trong mã) mà không cần hack file Reference.cs? –

+0

@Dave Web Services đóng gói các phương thức, vì vậy nếu không có phương pháp nào sử dụng Enum, thì không có điểm - từ góc độ dịch vụ web - để nó được tham chiếu. Tôi khuyên bạn nên hỏi một câu hỏi riêng với mô tả những gì bạn muốn làm/tại sao bạn muốn một enum không được quan tâm trong đó. –

6

Tôi khuyên bạn không nên chuyển một số nguyên giữa chúng, chỉ đơn giản là vì mục đích dễ đọc và gỡ lỗi. Giả sử bạn đang xem các nhật ký của mình và bạn thấy một loạt 500 lỗi cho DocumentType = 4. Bây giờ bạn phải tìm kiếm DocumentType nào là 4. Hoặc nếu một trong các ứng dụng đề cập đến một số không tồn tại trong cái kia, có lẽ là do các phiên bản không khớp.

Mã này hơi hơn một chút, và nó chà phần gõ tĩnh của bộ não một chút thô, nhưng trong các giao thức trên đầu trang của HTTP, sự khôn ngoan nhận được là bên với các chuỗi dễ đọc trên các bảng liệt kê.

6

Tôi vẫn sẽ sử dụng liệt kê trong nội bộ nhưng hy vọng người tiêu dùng chỉ chuyển cho tôi tên, chứ không phải giá trị số.

chỉ là một số ví dụ để minh họa ngớ ngẩn:

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

[WebMethod] 
public void UploadDocument(string type, byte[] data) 
{ 
    DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type); 
} 
3

Trong .NET, các giá trị liệt kê là (theo mặc định) đăng vào xml với tên. Đối với các trường hợp bạn có thể có nhiều giá trị (flags), thì nó sẽ đặt khoảng cách giữa các giá trị. Điều này làm việc vì việc liệt kê không chứa khoảng trắng, vì vậy bạn có thể lấy lại giá trị bằng cách tách chuỗi (ví dụ: "Invoice Contract SignedWorkOrder", sử dụng ví dụ của lubos).

Bạn có thể kiểm soát việc tuần tự hóa các giá trị của dịch vụ web asp.net bằng cách sử dụng XmlEnumAttribute hoặc sử dụng thuộc tính EnumMember khi sử dụng WCF.

3

Nếu bạn đang sử dụng dịch vụ Web của bạn từ một trang .NET/ứng dụng, bạn sẽ có thể truy cập điều tra sau khi bạn thêm tham chiếu Web của bạn vào dự án đang tiêu thụ dịch vụ.

0

Tôi đã nhận thấy rằng khi sử dụng "Thêm tham chiếu dịch vụ" trái ngược với "Thêm tham chiếu web" từ VS.net, giá trị enum thực tế bắt gặp cũng như tên enum. Điều này thực sự gây phiền nhiễu vì tôi cần hỗ trợ cả khách hàng 2.0 và 3.5. Tôi cuối cùng phải đi vào mã proxy dịch vụ web 2.0 tạo ra và tự thêm các giá trị enum mỗi khi tôi thực hiện một thay đổi!

3

Nếu bạn không làm việc với .NET to .NET SOAP, bạn vẫn có thể xác định một điều tra viên được cung cấp cả hai điểm cuối đang sử dụng 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> 

Công cụ lên tới WSDL -> Công cụ tạo proxy để phân tích thành tương đương với ngôn ngữ khách hàng.

2

Có một số lý do khá tốt để không sử dụng enum s trên ranh giới giao diện như vậy. Hãy xem xét Dare's post về chủ đề này.

Các vấn đề liên quan