Удаление объектов в слое обслуживания: должен ли я вызывать удаление (элемент T) или вызывать удаление (список <T>список)? - PullRequest
0 голосов
/ 06 января 2011

Мой пользователь может удалить несколько объектов в DataGrid.Должен ли я создать метод DeleteCustomer в своем классе customerService

как

Presenter / ViewModel:

public void DeleteCustomers()
{
    foreach(...SelectedCustomers)
    {
        customerService.DeleteCustomer(item);
    }
}

ИЛИ

public void DeleteCustomers()
{
  customerService.DeleteCustomers(SelectedCustomers);
 // The DataProvider is enumerating the list...
}

Что вы думаете лучше?

Ответы [ 5 ]

1 голос
/ 06 января 2011

Вы уже ответили на вопрос самостоятельно.При удалении отдельного клиента вы звоните:

customerService.DeleteCustomer(item);

Это указывает на то, что вы передаете элементы, подлежащие удалению, обратно в службу (что на самом деле является абстракцией определенного способа работы с клиентами), Вы четко указываете, что служба лучше всех знает, как выполнить эту операцию.

С этой целью удаление нескольких клиентов должно быть аналогично последнему варианту:

customerService.DeleteCustomers(SelectedCustomers);

Вы получаете несколько преимуществ здесь:

  • Вы снова подтверждаете, что служба лучше знает, как выполнить эту операцию.Возможно, служба (или все, что она абстрагирует) может оптимизировать пакетную операцию способами, которые недоступны или не очевидны потребителям службы.
  • Если это вызов службы / WS / SOA, то лучшие практики указывают начто вам следует предпочитать меньше "коротких" звонков, чем частых легких звонков.
0 голосов
/ 06 января 2011

Как правило, в сценарии клиент-сервер вы хотите минимизировать количество обращений.

Очевидно, это означает, что между перечислением коллекции и индивидуальным удалением и одновременным удалением коллекции последний вариант является лучшим.

Однако, в качестве альтернативы, чтобы еще больше уменьшить связь, вы можете собирать мутации в коллекцию (Добавить, Удалить, Заменить и т. Д.) И только тогда, когда пользователь нажимает, например, «Сохранить», вызвать службу и отправить через набор изменений.

0 голосов
/ 06 января 2011

Я бы использовал оба метода ... если вам нужно всего лишь удалить одного клиента в какой-то момент, это раздражает необходимость обернуть один экземпляр в IEnumerable

0 голосов
/ 06 января 2011

Я бы пошел со вторым, поскольку это ясно показывает, что вы хотите сделать.

0 голосов
/ 06 января 2011

Есть ли причина, по которой DataProvider не должен перечислять IEnumerable<T>?Если нет, просто воспользуйтесь вторым способом, и пусть DataProvider позаботится об этом.

...