2010-05-10 41 views
5

Tôi đang thiết kế một bộ đối tượng lớp 'dịch vụ' (đối tượng dữ liệu và định nghĩa giao diện ) cho dịch vụ web WCF (sẽ được tiêu thụ bởi khách hàng bên thứ ba tức là không ở trong nhà, ngoài tầm kiểm soát trực tiếp của tôi).Tôi có nên đặt một số phiên bản chính vào không gian tên C#/Java không?

Tôi biết rằng tôi là sẽ không nhận định nghĩa giao diện chính xác - và muốn chuẩn bị cho thời gian khi tôi biết rằng mình sẽ phải giới thiệu bộ đối tượng dữ liệu mới. Tuy nhiên, thực tế của thế giới tôi đang ở là tôi cũng sẽ cần phải chạy phiên bản đầu tiên của tôi đồng thời trong một thời gian dài.

Phiên bản đầu tiên của dịch vụ của tôi sẽ có URL của http://host/app/v1service.svc

và khi thời gian đến bởi phiên bản mới sẽ sống ở http://host/app/v2service.svc

Tuy nhiên, khi nói đến các đối tượng dữ liệu và giao diện, tôi sáng với việc đặt phiên bản 'chính' của số giao diện vào không gian tên thực của các lớp.

namespace Company.Product.V1 
{ 
    [DataContract(Namespace = "company-product-v1")] 
    public class Widget 
    { 
     [DataMember] 
     string widgetName; 
    } 

    public interface IFunction 
    { 
     Widget GetWidgetData(int code); 
    } 
} 

Khi thời gian đến cho một sự thay đổi cơ bản đối với các dịch vụ, tôi sẽ giới thiệu một số lớp như

namespace Company.Product.V2 
{ 
    [DataContract(Namespace = "company-product-v2")] 
    public class Widget 
    { 
     [DataMember] 
     int widgetCode; 

     [DataMember] 
     int widgetExpiry; 
    } 

    public interface IFunction 
    { 
     Widget GetWidgetData(int code); 
    } 
} 

Những lợi thế khi tôi nhìn thấy nó là tôi sẽ có thể có một đơn bộ mã phục vụ cả hai phiên bản giao diện, chức năng chia sẻ nếu có thể. Điều này là do tôi sẽ có thể tham chiếu cả hai phiên bản giao diện dưới dạng các đối tượng C# riêng biệt . Tương tự, khách hàng có thể sử dụng cả hai phiên bản giao diện đồng thời, có thể sử dụng V1.Widget trong một số mã số cũ trong khi các bit mới chuyển sang V2.Widget.

Có ai cho biết lý do tại sao đây là ý tưởng ngu ngốc không? Tôi có một cảm giác dai dẳng rằng đây là một chút mùi ..

ghi chú: Tôi rõ ràng không đề xuất mọi phiên bản mới của dịch vụ sẽ nằm trong một không gian tên mới. Có lẽ tôi sẽ thực hiện càng nhiều thay đổi giao diện không phá vỡ , nhưng tôi biết rằng tôi sẽ đạt đến một điểm trong đó tất cả các mô hình dữ liệu có thể sẽ cần phải ghi lại đáng kể.

Tôi hiểu phiên bản lắp ráp v.v. nhưng tôi nghĩ câu hỏi này là tiếp tuyến với loại phiên bản đó. Nhưng tôi có thể sai.

Trả lời

3

Tôi đã thực hiện theo cách bạn đã có (với V1, V2 không gian tên và không gian tên Common) và nó hoạt động khá tốt.Về cơ bản, tôi có mã thực tế được triển khai trong không gian tên Common và mỗi một trong số V1, V2, v.v. chỉ hoạt động như một trình bao bọc xung quanh nó.

Trong trường hợp của chúng tôi, các phiên bản cũ hơn thường ở lại trong một thời gian. Thông thường, khi khách hàng yêu cầu quyền truy cập vào API của chúng tôi, chúng tôi sẽ cung cấp cho họ phiên bản "hiện tại" vào thời điểm đó và họ sẽ chỉ sử dụng phiên bản đó mãi mãi - trừ khi có trường hợp kinh doanh nghiêm trọng để chuyển sang phiên bản mới hơn không bao giờ làm.

1

Thông thường tôi đã thấy (và tự làm) chỉ cần gọi phiên bản 2 Widget2, IWidget2, v.v. Nếu bạn mong đợi v2 (có thể) là kết thúc, dựa trên các bài học kinh nghiệm từ việc xem v1 trong tự nhiên, thường là tốt. Nhưng nếu bạn mong đợi nó là một thứ liên tục phát triển, có thể nghĩ về một cách tiếp cận hợp đồng lỏng hơn.

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