2011-04-02 27 views
1

我Order類:如何在客戶需要時添加客戶可見的擴展?

public class Order : IOrder 
    { 
     public long Id { get; private set; } 
     public string Serial { get; private set; } 
     public long CustomerId { get; set; } 

     public Order() { } 

     public IOrderItems GetOrderItems() 
     { 
      return new OrderItems(Id); 
     } 

    } 

,我想補充和延伸下令:的OrderItems,所以我用了擴展對象模式 - 你可以看到訂單有GetOrderItems()。的OrderItems的樣子:

public class OrderItems : IOrderItems 
{ 
    public IItem[] Items { get; set; } 

    public OrderItems(long orderId) 
    { 
     Items = Item.GetItems(orderId); 
    } 
} 

因爲我寫的web應用程序,我使用的Web服務。 我的問題是,有時我需要檢索訂單數據,而沒有它的項目和時間我需要使用它的項目檢索訂單數據。 檢索Order對象並沒有多大幫助,因爲它不會檢索到客戶端的Items。如果我將GetOrderItems轉換爲屬性 - 我將始終將OrderItems返回給客戶端,而不是我正在尋找的。

另外 - 有時客戶會想打電話給一個web服務,只有順序參數,有時客戶會想調用其他的web服務與訂單和項目作爲參數。

我該如何解決這個問題?

回答

1

也許我誤解了你的問題,但是你不能只在你的web服務中提供兩種方法來覆蓋這兩個選項嗎?因此,如果我們改變你的Order類是這樣的:

public class Order : IOrder 
{ 
    public long Id { get; private set; } 
    public string Serial { get; private set; } 
    public long CustomerId { get; set; } 
    public IOrderItems OrderItems { get; set; } 

    public Order() { } 

    internal IOrderItems LoadOrderItems() 
    { 
     OrderItems = new OrderItems(Id); 
    } 
} 

然後,您可以添加這將是大約一個Web服務實現如下:

public class OrdersService : IOrderService 
{ 
    public IOrder LoadOrderOnly(long id) 
    { 
     var order = someDataAccessInstance.LoadOrder(id); 
     return order; 
    } 

    public IOrder LoadOrderWithItems(long id) 
    { 
     var order = someDataAccessInstance.LoadOrder(id); 
     order.LoadOrderItems(); 
     return order; 
    } 
} 
+0

這可以工作,但你覺得什麼:一個可以使用新的Order()初始化訂單;然後可能認爲OrderItems不是空的。你怎麼看? – Naor 2011-04-02 14:27:38

+0

另一個問題 - 如果我有webservice返回所有訂單與他們的項目,在這種情況下,我必須循環所有的訂單,以加載項目? – Naor 2011-04-02 14:31:49

+1

我假設有非常特殊的情況,您的客戶端爲了獲取數據而調用了其中一種方法或其他方法。如果不是,那麼客戶端總是需要檢查OrderItems屬性是否爲空 - 如果調用LoadOrderOnly,它會是什麼。 – 2011-04-02 14:32:17