2011-01-05 3 views
0

Мой пользователь может удалить несколько объектов в DataGrid. Должен ли я создать теперь метод DeleteCustomer в моем классе CustomerServiceУдалить объекты на уровне обслуживания: Должен ли я выбрать элемент Удалить (T) или вызвать список «Удалить» (список <T>)?

как

Presenter/ViewModel:

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

ИЛИ

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

Как вы думаете лучше?

+0

@casperOne haha ​​вы были быстры, P – msfanboy

+0

Время от времени это проклятие. = P – casperOne

ответ

1

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

customerService.DeleteCustomer(item); 

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

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

customerService.DeleteCustomers(SelectedCustomers); 

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

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

Думаю, вы имели в виду это, может быть, его грамматист? «Возможно, DATAPROVIDER может оптимизировать пакетную операцию ...» – msfanboy

+0

@msfanboy: Нет, 'customerService' - это абстракция в лучшем случае, и четко не определено, что такое персистирование mechansim (и не должно быть, на этом уровне). Идея состоит в том, что если менеджер знает, как выполнять массовые операции, то он должен раскрывать методы для этого, так как это то, что должно иметь знания о домене, о том, как лучше всего это делать. – casperOne

0

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

0

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

0

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

+0

Ну, если у пользователя есть MultiSelection в DataGrid, я должен выполнить проверку wetter, если подсчет выбора> 1, а затем вызвать DeleteCustomers else DeleteCustomer? это не так хорошо ... – msfanboy

+0

ничего не значит, что ваш класс customerService может быть обеспокоен ... он не знает, какой код клиента в какой-то момент назовет его, он должен просто разоблачить, что он может сделать. –

0

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

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

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