Я создаю веб-сервис для получения списка составных объектов. Если комплексное подсвойство каждого объекта в списке заполняется сразу, или можно, чтобы клиент запрашивал эту информацию по мере необходимости.
Примере:
class InvoiceLine
{
string ServiceDescription;
decimal ChargeTotal;
}
class Invoice
{
string InvoiceNumber;
string CustomerNumber;
List<InvoiceLine> InvoiceLines;
}
//Returns all invoices send to this customer
public List<Invoice> GetInvoices(string customerNumber);
Плохой дизайн иметь другой метод в WebService как:
public List<InvoiceLine> GetInvoiceLines(string invoiceNumber)
И потребовать от клиента сначала получить список всех сохраненных счетов-фактур (с пустым списком InvoiceLines в них и ожидать, что они вызовут:
invoices[0].InvoiceLines = webService.GetInvoiceLines(customerNumber);
Имитировать "ленивую загрузку".
Это кажется хорошим способом сэкономить на объеме, но за счет большего количества вызовов для получения данных при необходимости. Стоит ли это того или это какой-то антипаттерн?
Просто не кажется правильным возвращать наполовину заполненный объект ...
Заранее благодарим за любые указатели / ссылки.
3 ответа
Детализация интерфейса сервиса всегда является важным решением при проектировании ваших сервисов. Поскольку вызовы веб-служб обычно являются вызовами сети или, по крайней мере, вызовами вне процесса, они относительно дороги. Если интерфейс вашей службы слишком мелкозернистый (или "болтливый"), это может повлиять на производительность. Конечно, при определении правильного уровня детализации необходимо учитывать свое приложение и свои требования. Программные компоненты: крупнозернистый или мелкозернистый, хотя у little dry есть полезная информация.
Просто не кажется правильным возвращать наполовину заполненный объект ...
Я согласен.
В вашем случае предположим, что InvoiceLines дорого обходится и не требуется большую часть времени. В этом случае вы можете инкапсулировать сводку или заголовок счета и вернуть эту информацию. Однако, если потребителю нужен полный счет, предложите ему это сделать.
class InvoiceLine
{
string ServiceDescription;
decimal ChargeTotal;
}
class Invoice
{
InvoiceSummary InvoiceSummary;
List<InvoiceLine> InvoiceLines;
}
class InvoiceSummary
{
string InvoiceNumber;
string CustomerNumber;
}
public InvoiceSummary GetInvoiceSummary(string customerNumber);
public Invoice GetInvoice(string customerNumber);
В общем, я предпочитаю избегать навязывания последовательности обращений потребителю услуги. То есть сначала вы должны получить счет, а затем - детали. Это может привести к проблемам с производительностью, а также к более тесной связи между приложениями.
Веб-службы не должны быть «болтливыми»: вы общаетесь по сети, и любой обмен запросами / ответами требует времени. Вы же не хотите требовать от клиента спрашивать десять раз, когда он может спросить один раз.
Позвольте клиенту запросить все данные сразу.
Если это окажется проблемой производительности, позвольте клиенту указать, сколько данных он хочет, но все они должны быть возвращены за один вызов.
Я не думаю, что это плохой дизайн, я думаю, что это компромисс, который нужно учитывать. Что важнее: возврат полного графа объекта или потенциальная экономия на передаче.
Если, например, у вас больше шансов иметь клиентов с несколькими сотнями или тысячами InvoiceLines
, и они вам нужны только в очень определенных обстоятельствах, то кажется очень логичным разделить их указанным вами способом.
Однако, если вам почти всегда нужны InvoiceLines
, и вы обычно говорите только о 10 экземплярах, то имеет смысл всегда отправлять их вместе.
Похожие вопросы
Новые вопросы
wcf
Windows Communication Foundation является частью .NET Framework, которая предоставляет унифицированную модель программирования для быстрого создания сервис-ориентированных приложений.