Базовый класс для веб-службы ASMX - вызов производного метода из базового класса, который он сам - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть несколько веб-сервисов asmx, и во всех методах внутри веб-сервисов используется общий шаблон

public virtual TestObject Test()

{
   LogRequest;
   try
   {
    DoSomething;
   }
   catch
   {
     LogException;
   }

   LogResponse;
   return response;
}

, и все методы следуют этому шаблону, много повторений кода;Я хочу знать, есть ли способ сделать это в общем, то есть: может быть в конструкторе базового класса?это вообще возможно?

РЕДАКТИРОВАТЬ:

Шаблонный метод был хорошим решением, но в итоге самым элегантным решением для нас был AOP !!все журналы были извлечены в аспект, и все методы, которые требовали ведения журнала, были оформлены с использованием атрибута и опубликовали четкие правила!

Ответы [ 3 ]

3 голосов
/ 08 сентября 2010

Вы можете где-нибудь иметь метод (в базовом классе или объявленном как статический), который делает все обычные вещи:

T DoCommon<T>(Request r, Func<T> f)
{
  LogRequest(r);

  T result;
  try { result = f(); }
  catch(Exception ex) { LogException(ex); } 

  LogResult(result);
  return result;
}

И тогда вам нужно будет только включить вызов этого метода:

public virtual TestObject Test()
{
   return DoCommon(Request, () => DoSomething());
}
2 голосов
/ 08 сентября 2010

Звучит так, как будто вы ищете Шаблонный шаблон .Этот шаблон позволяет вам определить последовательность шагов в суперклассе (и реализации этих шагов по умолчанию, если применимо) - тогда подклассы должны только переопределять шаги, относящиеся к их конкретной обработке.

0 голосов
/ 10 апреля 2013

Шаблонный метод был хорошим решением, но в итоге самым элегантным решением для нас было АОП !! все журналы были извлечены в аспект, и все методы, которые требовали ведения журнала, были оформлены с использованием атрибута и опубликовали четкие правила!

...