2010-08-16 28 views
6

là nó ít nhiều thể chấp nhận được (tức là tiêu chuẩn) để tạo ra một dịch vụ công khai tiếp xúc với web với những chữ ký phương pháp:Web Service: Single String Parameter Hoặc Loại Complex Thông số

ThisMethodDoesSomething(ComplexType param) 

ThisMethodDoesSomethingElse(AnotherComplexType param) 

Hoặc này:

ThisMethodDoesSomethingAndSomethingElse(string xml) 

Trường hợp hoạt động đang được thực hiện tùy thuộc vào chuỗi XML được chuyển đến một phương thức không-tất cả-tất cả? Tôi đã luôn luôn đi với cựu, nhưng một đồng nghiệp của tôi thích thứ hai và tôi đang cố gắng cân nhắc ưu và khuyết điểm của cả hai chiến lược trước khi chúng tôi bắt đầu một dự án mới. Điều nào được công chúng chấp nhận và dễ dàng hơn để làm việc cùng và tại sao?

Trả lời

0

Tôi thích (và đó là từ tác dụng, thích, vì không có tiêu chuẩn cho điều này) một chuỗi XML phức tạp giải thích hành động. Bạn có thể thấy điều này từ my open-source project.

Một số trong những lý do tôi thích nó ...

  1. Hành động của bạn là một ngôn ngữ diễn giải có thể uốn cong.
  2. Hành động có thể được kết hợp thành một chuyến đi mạng duy nhất.
  3. XML cho phép mở rộng bộ tính năng trong khi không phá vỡ các tính năng trước đây.
  4. Phân cấp XML cho phép hành động hành động theo hành động phía máy chủ.
+0

Cảm ơn bạn đã trả lời. Trên bề mặt, điều này chỉ cảm thấy sai với tôi, loại như: tại sao tôi nên vượt qua int hoặc tăng gấp đôi xung quanh trong chương trình của tôi khi đối tượng sẽ làm gì? Đối tượng linh hoạt hơn, đúng không? Lý do khác mà tôi không bị hấp dẫn đối với phương pháp này là Phương thức (chuỗi) không phải là tự viết tư liệu là Phương thức (int) hoặc Phương thức (loại khác). Điểm 1 và 3 của bạn hợp lý. Bạn có thể mở rộng điểm 2 và 4 một chút không? –

1

Trước đây tôi đã ưu tiên thứ hai, vì tôi không chắc chắn, nếu trong tình huống nền tảng chéo, mọi khách hàng SOAP sẽ có thể tiêu thụ các loại phức tạp một cách chính xác. Vì vậy, tôi nghĩ rằng một cuộc gọi SOAP, mà chỉ mất và trả về (XML-) Strings sẽ cho tôi không đau đầu. Trong khi chờ đợi, tôi có kinh nghiệm nói chung là không có vấn đề với cách tiếp cận đầu tiên ít nhất cho. Net tương tác với JAVA/AXIS và ngược lại. Tôi vẫn đang xem để làm cho loại phức tạp không quá phức tạp.

Tôi giả định rằng ThisMethodDoesSomething()ThisMethodDoesSomethingElse() là các hoạt động nguyên tử? Nếu trường hợp này không xảy ra (ThisMethodDoesSomethingElse() yêu cầu gọi đến số ThisMethodDoesSomething() để thực hiện), cách tiếp cận đầu tiên là không thực hiện được.

0

Câu hỏi của bạn dường như giống với câu hỏi về giao diện hạt thô và hạt mịn ở cái nhìn đầu tiên. Mặt khác, tôi cảm thấy như cách tiếp cận thứ hai là lấy hạt thô đến mức cực đoan, nếu bạn biết ý tôi là gì. Bạn mất tất cả các loại kiểm tra. Bạn thực hiện việc thực hiện rất khó khăn - bạn sẽ cần rất nhiều trường hợp bên trong mã sao lưu để thực sự tìm ra yêu cầu là gì. Phương thức sẽ trả về cái gì? Tôi đoán nếu bạn chỉ nhận được một chuỗi như một tham số, bạn sẽ trả về một chuỗi khác. Vì nó là một String, và tôi đoán nó là một biểu diễn chuỗi của một tài liệu XML, bạn sẽ phải phân tích cú pháp một phần của mã sao lưu của bạn. Khi giao diện trở nên lớn hơn, tôi đoán chúng sẽ biến thành các phương pháp thần. Danh sách tiếp tục :)

Như một lưu ý phụ, đừng nghĩ rằng tôi đang ủng hộ giao diện hạt mịn. Phải có sự cân bằng giữa hai người. Một quy tắc chung cho tôi sẽ là luôn luôn vượt qua một yếu tố.

0

Tôi thường tạo lược đồ xml để mô tả các thông báo sẽ hình thành giao diện của tôi. Sau đó, bằng cách sử dụng trình tạo lớp xsd đến lớp như Castor hoặc Microsoft xsd.exe, tôi tạo các lớp triển khai của mình.

2

Tôi sẽ không bao giờ gửi chuỗi XML. Trước hết, "XML" không giống với "chuỗi". Họ không tuân theo các quy tắc tương tự.

Bất kỳ khách hàng hợp lý có thể chấp nhận một loại phức tạp bao gồm các kiểu dữ liệu và danh sách hoặc mảng của các loại nguyên thủy, đệ quy (C# cú pháp):

public class ComplexType1 
{ 
    public int IntegerProperty {get;set;} 
    public int[] ArrayOfIntegers {get;set;} 
    public List<int> ListOfIntegers {get;set;} // Same as ArrayOfIntegers 
} 

public class ComplexType2 
{ 
    public ComplexType1 CT1 {get;set;} 
    public List<ComplexType1> LCT1 {get;set;} 
} 

Thẳng thắn mà nói, bất kỳ khách hàng mà không thể đối phó với một cái gì đó như ở trên xứng đáng được nghỉ hưu.

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