Для одного из моих модулей DAL у меня много дубликатов сантехники в форме:
while (retry)
{
...
try
{
...do something
retry = false;
}
catch (SqlException sqlEx)
{
// Retry only if -2 = Connection Time Out or 1205 = Deadlock
if (sqlEx.Number == -2 || sqlEx.Number == 1205)
{
..retry if attempt < max
}
..log and rethrow exception
}
}
и, обнаружив недавно PostSharp, я пытаюсь заменить этот сантехнический код атрибутом.
Мой первоначальный план состоял в том, чтобы:
- расширить OnMethodInvocationAspect и запомнить аргументы события вызова метода во время вызова метода
- реализовать IOnExceptionAspect и реализовать OnException для проверки типа исключения, и, если требуется повторная попытка, используйте объект args события вызова метода из исходного вызова, т.е.
[Serializable]
public sealed class RetryAttribute : OnMethodInvocationAspect, IOnExceptionAspect
{
[NonSerialized]
private MethodInvocationEventArgs m_initialInvocationEventArgs = null;
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
if (m_initialInvocationEventArgs == null)
m_initialInvocationEventArgs = eventArgs;
base.OnInvocation(eventArgs);
}
public void OnException(MethodExecutionEventArgs eventArgs)
{
// check if retry is necessary
m_initialInvocationEventArgs.Proceed();
}
}
но метод OnInvocation больше не запускается после добавления IOnExceptionAspect ..
Кто-нибудь знает, что мне здесь делать? Или, может быть, мне стоит использовать более подходящий аспект?
Спасибо