如何添加仅在客户需要时才能看到的扩展程序?

时间:2011-04-02 13:40:05

标签: c# .net web-services design-patterns

我有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,所以我使用扩展对象模式 - 你可以看到Order有GetOrderItems()。 OrderItems看起来像:

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

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

由于我正在编写Web应用程序,因此我使用的是Web服务。 我的问题是,有时我需要检索Order数据,而不需要使用Items和somwtimes我需要使用它的Items检索Order数据。 检索Order对象没有多大帮助,因为它没有检索到客户端的项目。如果我将GetOrderItems转换为属性 - 我将始终将OrderItems返回给客户端,这不是我想要的。

此外 - 有时客户端会想要调用一个只有Order作为参数的Web服务,有时客户端会想要将Order和Items作为参数调用其他Web服务。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

也许我误解了你的问题,但是你不能只在你的网络服务中提供两种方法来涵盖这两种选择吗?因此,如果我们更改您的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;
    }
}