删除服务层中的实体:我应该预先删除(T项)还是调用删除(List <t>列表)?</t>

时间:2011-01-05 21:14:15

标签: c# service dataprovider

我的用户可以删除DataGrid中的多个实体。 我应该在customerService类中创建一个DeleteCustomer方法

喜欢

演示/视图模型:

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

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

您认为哪种更好?

5 个答案:

答案 0 :(得分:1)

你已经自己回答了这个问题。在删除单个客户时,请致电:

customerService.DeleteCustomer(item);

这表明您将要删除的项目传递回服务(这实际上是对如何处理客户的特定方式的抽象)。 您明确表示该服务最了解如何执行此操作。

为此,删除多个客户应该像后一个选项:

customerService.DeleteCustomers(SelectedCustomers);

你在这里获得了一些好处:

  • 您再次知道该服务最了解如何执行此操作。也许服务(或其抽象的任何东西)可以以不可用的方式优化批处理操作,或者对服务的消费者立即显而易见。
  • 如果这是一个服务/ WS / SOA呼叫,那么最佳实践表明,您应该通过频繁的轻度呼叫来减少“粗略”呼叫。

答案 1 :(得分:0)

为什么DataProvider不应该枚举IEnumerable<T>?如果没有,只需使用第二种方式,让DataProvider处理它。

答案 2 :(得分:0)

我会选择第二个,因为这显然会暴露你想要做的事情。

答案 3 :(得分:0)

我会有两种方法......如果你只需要在某个时候删除一个客户,那就讨厌将一个实例包装在IEnumerable中

答案 4 :(得分:0)

通常在客户端 - 服务器方案中,您希望最小化往返次数。

显然这意味着在单独枚举集合和删除之间,并立即删除集合之后,后者是更好的选择。

然而作为替代方案,为了进一步减少通信,您可以收集集合中的突变(添加,删除,替换等等),并且仅当用户按下“保存”时,才调用该服务并发送一组更改。