Olá pessoal,
Estou desenvolvendo uma classe para fazer log, onde tenho até agora dois métodos, um para fazer log de exception e um para log de mensagem em geral.
O problema é que meu arquivo de log tem que ter no máximo 5mb, então antes de escrever qualquer coisa, eu preciso ver se esse tamanho foi ultrapassado e tomar alguma ação. E como essa classe tem que ser thread-safe, tudo isso precisa acontecer dentro de um lock. Ou seja, meu esqueleto dos dois métodos está assim:
try
{
PrepareWrite()
Escreve no log
}
catch (Exception e)
{
Debug.WriteLine(e.ToString())
}
finally
{
TerminateWrite()
}
O problema é que esse esqueleto está repetido hoje em dois métodos (o da exception e da mensagem), mas essa classe pode crescer no futuro, e eu não quero essa mesma estrutura se repetindo, correndo o risco de ser esquecida, alterada, etc.
Pensei em algumas soluções:
- Usar esse esqueleto em apenas um método privado, e a parte do "Escreve no log" ser um Action. Isso seria bem fácil de fazer com lambda, mas hoje estou preso no .net 2.0 e fica bem chato criar delegates pra cada função.
- Criar um scope guard implementando IDisposable e transformar esse bloco num using em cada função. Ainda teria repetição mas me parece mais elegante. O problema é que esse scope guard faria um lock no construtor e um unlock no Dispose. Se alguém no futuro usar essa classe de forma errada, estaria com um grande problema.
O que vocês acham? Tem alguma solução mais elegante para esse problema? Aceito sugestões!
André