У меня есть класс, который имеет около 200+ методов, каждый из этих методов делает вызов в базу данных или сетевой ресурс.
В идеале я хотел бы обернуть каждый вызов в try/catch, чтобы поймать любое из общих сетевых или SQL-исключений и дать пользователю возможность повторить попытку (при необходимости). Однако, чтобы добавить этот код к каждому вызову, он будет очень трудоемким и раздутым в отношении кода.
Я думал об упаковке каждого вызова метода другим методом, создав делегат и обернув код делегирования в try/catch.. что-то вроде этого...
(Игнорируйте синтаксис.. это просто концептуальный пример)
bool CallUpdatePassenger(int PassengerId,string PassengerName,string PhoneNumber)
{
Delegate del= Delegate.CreateDelegate(typeof(UpdatePassengerDelegate), typeof(IPassengerServices).GetMethod("RemoteUpdatePassenger"));
bool Res=(bool)CallDelegate(del,PassengerName,PhoneNumber);
}
object CallDelegate(Delegate del,params object[] args)
{
object Result=null;
try
{
Result=del.DynamicInvoke(args);
}
catch (Some.Timeout.Error.Or.Whatever te)
{
// take some action.. maybe retry etc..
}
return Result;
}
Может быть, есть более практичный способ сделать это?
Код автоматически генерируется (с помощью инструмента, который я написал). Я могу легко включить что-то вроде выше, но я хочу, чтобы не писать вышеприведенный код для каждого вызова метода.
Кроме того, если я делаю что-то вроде выше, я могу использовать методы времени и вызовы методов журнала и т.д. Это просто кажется неуклюжим (и не сильно типизированным).
Спасибо Рич.