1

我正在开发一个从其他系统中删除信息的系统。例如,有一个客户数据库,如果客户最近的订单是六年或更长时间,则可以删除他们。

我可以想到两种方法:

  1. 为每个系统创建类,例如 Customer(用于客户数据库)、Order(用于 Order 数据库)等。在每个多态类中都有一个名为 Delete 的函数,即客户端可以在每个类中调用 Delete,这将删除必要的记录。
  2. 将做出有关实体的决定所需的所有信息(例如,使用 SSIS 的 Order 复制到副本数据库中)复制并生成应删除的所有内容的大查询。这是一种数据仓库类型的方法。

我无法决定哪个选项更好。

4

3 回答 3

2

我会对你的第一种方法提出异议。我不确定所有单独的业务类是否会以某种方式共享一个Delete方法的相同接口。删除客户所需的参数可能与删除订单所需的参数不同。强迫他们共享相同的界面似乎很奇怪。这样做可能会不必要地限制将来代码的灵活性。此外,删除客户的业务逻辑会涉及盲目循环其他对象,没有特定顺序,并在所有对象上调用方法,这似乎很奇怪Delete。我认为您希望更好地控制它们被删除的顺序以及当其中一种删除方法失败时如何处理它。

我建议首先在更高的层次上考虑它。您实际需要哪些业务方法?根据您描述的场景,我可以看到两种业务方法:

  • 获取过去 6 年没有订单的所有客户的列表
  • 删除客户(连同其所有订单)

由于这两种方法都与客户相关,因此将它们组合成一个单一的客户业务类是有意义的。例如:

Public Interface ICustomerBusiness
    Function GetStaleCustomers(timeSinceLastOrder As TimeSpan) As IList(Of CustomerDto)
    Sub DeleteCustomer(customerId As Integer)
End Interface

一旦你像这样封装了业务逻辑,现在数据访问层如何实现就无关紧要了。客户端调用那些简单的业务层方法,不必关心幕后的逻辑是如何工作的。将业务逻辑封装在其自己的层中,您可以自由地以不同的方式重写它,而无需重写任何客户端代码。

那么该业务类内部的逻辑是什么样的呢?它可以是对数据访问方法的一次调用,该方法通过一个庞大的 SQL 命令完成所有工作,也可以进行多次调用以分别执行每个步骤。这真的取决于你。显然前者效率更高,但后者更灵活。这一切都取决于您的需求。下面是一个简单的示例,说明每个可能的样子:

Public Sub DeleteCustomer(id As Integer)
    _customerDataAccess.DeleteCustomerAndOrders(id)
End Sub

' or...

Public Sub DeleteCustomer(id As Integer)
    For Each i As OrderDto In _orderBusiness.GetOrdersByCustomer(id)
        _orderBusiness.DeleteOrder(i.Id)
    Next
    _customerDataAccess.DeleteCustomer(id)
End Sub

出于多种原因,第二种选择会更加灵活。例如:

  • 您可以更好地控制正在发生的事情和时间。如有必要,您可以在此过程中提供详细的状态更新。它还允许您在出现故障时提供详细的跟踪记录和更精确的错误消息。
  • 删除订单的业务逻辑将分解为一个单独的可重用业务类。如果您只需要从代码中的其他位置删除一个订单,您可以通过通用代码执行此操作。
于 2013-08-28T19:05:38.880 回答
1

两者似乎都有其优点和缺点,我个人会走第二条路线,特别是如果您正在处理大量记录,以免因连续点击删除记录而占用数据库。

于 2013-08-28T18:37:01.863 回答
1

第三种方法是使用具有多个代理的消息传递系统。这种方法非常适合非常复杂的场景。

这是一个场景:

用户运行命令来删除实体(订单、客户等)。用户正在使用的工具在工作队列中创建一条表示用户意图的消息(例如“删除客户 123”)

消息由一个或多个代理处理。每个代理都特定于较大操作的一部分,并且仅侦听相关消息。所有代理都在单个分布式事务中工作。这意味着每个代理都有一个非常狭窄的特定范围,但任何代理都可以拒绝整体操作。如果代理需要执行其他子任务,它可以为这些操作排队附加消息(例如删除属于客户的每个订单)。

这种方法可以很好地扩展,尤其是对于非常复杂的交互。它避免了任何一个系统必须了解所有其他系统。每个代理都知道要处理哪些消息,并处理与该消息相关的非常具体的任务。

它最初设置更多,但非常可扩展(您可以添加新代理、消息等而不影响现有代理)。

如果您决定使用这种方法,请查看MassTransit的框架(还有其他框架)。如果您在.NET 中工作,那么它是一个非常好的系统,功能强大但平易近人。它的Sagas特别适合协调多个代理之间的复杂交互。

于 2013-08-28T19:12:20.173 回答