2013-05-06 42 views
8

Tôi đang sử dụng dịch vụ web SOAP. Dịch vụ web chỉ định một URL dịch vụ riêng biệt cho từng khách hàng của mình. Tôi không biết tại sao họ làm điều đó. Tất cả các chức năng và thông số của chúng đều giống nhau về mặt kỹ thuật. Nhưng nếu tôi muốn viết một chương trình cho dịch vụ tôi phải biết cho mỗi công ty là nó dự định. Điều đó có nghĩa cho một công ty được gọi là "quả táo" tôi phải sử dụng câu lệnh sử dụng sau đây:"đang sử dụng" hai thư viện khác nhau có chức năng gần như giống hệt nhau

using DMDelivery.apple; 

và cho người khác gọi là "màu da cam"

using DMDelivery.orange; 

Nhưng tôi muốn chương trình của tôi để làm việc cho tất cả chúng và có tên của công ty hoặc điểm tham chiếu dịch vụ làm tham số.

Cập nhật: Nếu tôi phải viết một ứng dụng riêng cho từng khách hàng thì tôi sẽ phải giữ tất cả chúng được cập nhật với mỗi thay đổi nhỏ và đó sẽ là một công việc không hiệu quả như số lượng khách hàng tăng lên.

Có ai có thể nghĩ ra giải pháp không? Tôi sẽ biết ơn.

+0

Tôi đoán bạn hiện đang thêm tham chiếu dịch vụ web bằng cách sử dụng "Thêm tham chiếu dịch vụ", tôi có đúng không? –

+1

Tôi nghĩ bạn có thể muốn sử dụng mẫu Adapter hoặc một số mẫu thiết kế khác ngoài đó (Mặt tiền cũng xuất hiện trong đầu). –

+0

bên trong mỗi không gian tên là gì? mô hình + hợp đồng? sự kiện nếu DMDelivery.apple.MyFunction và DMDelivery.orange.MyFunction dường như là cùng một phương pháp, nó 'không giống nhau trên thực tế. nó phức tạp hơn một chút. – Cybermaxs

Trả lời

3

Nếu bạn có hợp đồng cơ bản (giao diện) cho tất cả dịch vụ, bạn có thể sử dụng loại factory để khởi tạo dịch vụ cụ thể và chỉ tham chiếu đến giao diện trong mã khách hàng của bạn (mã gọi).

//service interface 
public interface IFruitService{ 
    void SomeOperation(); 
} 

//apple service 
public class AppleService : IFruitService{ 
    public void SomeOperation(){ 
    //implementation 
    } 
} 

Có ví dụ một loại lớp nhà máy (bạn có thể đặt using báo cáo của bạn ở đây)

public static class ServiceFactory{ 
    public static IFruitService CreateService(string kind){ 
    if(kind == "apple") 
     return new AppleService(); 
    else if(kind == "orange") 
     return new OrangeService(); 
    else 
     return null; 
    } 
} 

Và trong mã gọi của bạn (bạn chỉ cần thêm một tuyên bố using cho không gian tên chứa giao diện của bạn) :

string fruitKind = //get it from configuration 
IFruitService service = ServiceFactory.CreateService(fruitKind); 
service.SomeOperation(); 

Bạn cũng có thể sử dụng nguyên tắc Dependency Injection.

+0

điều này có nghĩa là tôi nên thực hiện riêng dịch vụ cho từng khách hàng (một cho Apple và một cho Orange) trong khi hầu hết các chức năng của họ đều giống nhau không? Điều đó sẽ tăng gấp đôi kích thước mã của tôi. – Disasterkid

+1

Không, những gì tôi cố gắng cho thấy là mỗi dịch vụ có thực hiện riêng và khi bạn nói "hầu như tất cả các chức năng của chúng đều giống nhau", thì bạn có thể tạo giao diện (hoặc lớp cơ sở) "ẩn" cài đặt mã gọi. Trong trường hợp này, mã gọi của bạn không biết nếu nó đang làm việc với dịch vụ "táo" hay "cam", nó chỉ biết rằng nó đang làm việc với việc triển khai giao diện 'IFruitService' (hoặc lớp cơ sở cộng). Bằng cách này bạn chỉ viết ** một lần ** mã cho khách hàng của bạn (mã gọi). – polkduran

+0

nghe có vẻ hợp lý. và thể hiện của dịch vụ để gọi (dù là táo hay cam) sẽ là thông số đầu vào phải không? – Disasterkid

0

Nếu mọi thứ đều giống nhau và chỉ là địa chỉ điểm cuối khác nhau, có thể bạn chỉ có thể thử thay đổi điều đó trước khi gọi các phương thức dịch vụ web.

MyWebServiceObject ws= new MyWebServiceObject(); 
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://www.blah.com/apple.asmx"); 
+0

Tôi có nhiều lớp học trong chương trình của mình. Tôi nên làm gì với tất cả những câu "sử dụng" đó? Có cách nào để công bố toàn cầu một tuyên bố sử dụng áp dụng cho tất cả các lớp đó không? Giống như "Thêm người dùng nhập" trong VB.Net. – Disasterkid

0
  1. Sử dụng bất kỳ một khách hàng trong việc thực hiện của bạn. ví dụ Apple
  2. Viết trình kiểm tra thư và đính kèm vào điểm ra ngoài
  3. Trong thanh tra thư thay thế không gian tên của loại có không gian tên khách hàng thích hợp. EX: Trước thanh tra thư: MyClinet.Apple.Type
    Sau khi thư kiểm tra: MyClient.Orange.Type, nếu nhà cung cấp có màu cam.
Các vấn đề liên quan