Я использую Логгина в моем классе операции обслуживания таким образомNlog шаблон протоколирования для общего поведения
public class MyServiceImplementation : IServiceInterface
{
static Logger log = LogManager.GetCurrentClassLogger();
public bool A()
{
try
{
log.Trace("Started");
// Do something A
log.Trace("Completed");
return true;
}
catch(Exception e)
{
log.Error(e);
}
return false;
}
public bool B()
{
try
{
log.Trace("Started");
// Do something B
log.Trace("Completed");
return true;
}
catch(Exception e)
{
log.Error(e);
}
return false;
}
}
В результате в журнале я вижу довольно записи как
MyServiceImplementation:B Started
MyServiceImplementation:B Completed
MyServiceImplementation:A Started
MyServiceImplementation:A Completed
Но при взгляде дизайна кода, это не довольно из-за дублирования логики, и я хочу написать как
public class MyServiceImplementation : IServiceInterface
{
static Logger log = LogManager.GetCurrentClassLogger();
private bool CallMethod(Action m)
{
try
{
log.Trace("Started");
m();
log.Trace("Completed");
return true;
}
catch(Exception e)
{
log.Error(e);
}
return false;
}
public bool A()
{
return CallMethod(()=> { //Do Something A })
}
public bool A()
{
return CallMethod(()=> { //Do Something B })
}
}
, но в этом случае я потерял стопку в журнале и информации о методе или B звонит Losted, я вижу CallMethod во всех случаях
MyServiceImplementation:CallMethod Started
MyServiceImplementation:CallMethod Completed
MyServiceImplementation:CallMethod Started
MyServiceImplementation:CallMethod Completed
Как взять две цели - довольно лесозаготовки и довольно-код?
Спасибо за ваш ответ, но в моем решении я не записываю имя метода в сообщение журнала, оно рассчитывается автоматически nlog из callstack. Я пишу только «Начал» и префикс A или B, вычисленный во время выполнения. В вашем примере - дублирование логики в обоих методах A и B. Но я хочу написать один общий обертка void Wrap (Action a) trace ("Started"); a(); След («Завершено»); } и использовать его во всех методах, таких как void A() { Wrapper (() => ....); } без потери вызова и имени метода в nlog – Json76
Мой код - всего лишь пример декоратора для логгинга. Я думаю, что если вы используете nlog с stacktrace в моем коде, вы должны получить что-то вроде 'LoggedServiceImpl: A Started'. С шаблоном декоратора вы разделяете ответственность, которая лучше, чем логинг и логика домена в том же классе. – jlvaquero
С nlog stacktrace в вашем примере я получу LoggedServiceImpl: A A Started, он автоматически оценивает имя метода из stacktrace. Вам не нужно писать имя метода вручную. И в этом случае метод A и B тождественно - все содержит одни и те же строки log.Trace («Started») и log.Trace («Completed»), и это поведение я хочу написать обычным способом. – Json76