как добавить расширения, которые будут видны клиенту только тогда, когда ему это нужно? - PullRequest
1 голос
/ 02 апреля 2011

У меня есть класс 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);
        }

    }

И я хотел добавить и расширение в order: OrderItems, поэтому я использовал шаблоны объектов расширений - как вы можете видеть, Order имеет GetOrderItems ().OrderItems выглядит следующим образом:

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

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

Поскольку я пишу веб-приложение, я использую веб-сервисы.Моя проблема в том, что иногда мне нужно получать данные Заказа без его Товаров, а иногда мне нужно получать данные Заказа с его Предметами.Получение объекта Order не очень помогает, так как он не получает клиенту его Предметы.Если я преобразую GetOrderItems в свойство - я всегда буду возвращать OrderItems клиенту, а это не то, что я ищу.

Кроме того - иногда клиент захочет вызвать один веб-сервис только с Orderв качестве параметра, а иногда клиент захочет вызвать другой веб-сервис с Order и Items в качестве параметров.

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 02 апреля 2011

Возможно, я неправильно понимаю ваш вопрос, но разве вы не можете просто предоставить два метода в своем веб-сервисе, чтобы охватить оба варианта?Поэтому, если мы изменим ваш 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); 
    } 
}

Затем вы можете добавить реализацию веб-службы, которая будет выглядеть примерно следующим образом:

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;
    }
}
...