我知道这已经被问过好几次了,但我想我可能有不同的解决方案;但是,我需要一些帮助才能使其正常工作。
思路:业务层调用数据层函数。数据层函数将对数据库上下文的存储过程函数的调用包装在重试策略中。本质上,我希望 LINQ 工具能够导入和管理对存储过程的实际调用,但我希望它能够使用一些重试策略来包装逻辑,以应对可重试的错误。
这个概念的大部分来自What is good C# coding style for catch SQLException and retrying,然而,这似乎只适用于 LINQ to SQL 命令,而不是调用在 DBML 中生成的存储过程函数。
老方法:
Sub BLFunctionWithoutRetry()
Using DB as CustDataContext
DB.sp_GetCustomers()
End Using
End Sub
重试的新逻辑:
Sub BLFunctionWithRetry()
GetCustomers()
End Sub
Function GetCustomers() As List(Of Customer)
Return Retry(Of List(Of Customer))(sp_GetCustomers())
End Function
Function Retry(Of T)(FunctionToCall As Func(Of T)) As T
Dim Attempt As Integer = 0
While True
Try
Using DB as MyDataContext
DB.FunctionToCall()
End Using
Catch ex as SQLException
If Retryable() Then Attempt += 1
If Attempt >= Max Or Not Retryable() Then Throw
End Try
End While
Function Retryable() As Boolean
Return True
End Function
这是总体思路;但是,我需要帮助编写上面的重试函数。我得到了明显的错误FunctionToCall() is not a member of 'MyDataContext'
。另外,我不知道如何编写它,因此它适用于具有任意长度输入参数的任何存储过程。