Recebi hoje a ligação de um desenvolvedor para auxiliá-lo na depuração de um serviço NT feito com .Net. Como a maioria das pessoas jamais fez um serviço NT para o Windows, a mesma maioria tem problemas para depurar. Até porque, quase todo o código vai no start do serviço, e quando você vai depurar tudo já aconteceu, inclusive eventuais erros.
(O segredo é mover o código do OnStart para o OnContinue, colocando um breakpoint no mesmo OnContinue, iniciar o serviço, atachar ao processo, pausar e reiniciar o serviço, e voilá, breakpoint alcançado. Simples não?)
Pois é, depurar serviços NT é um porre. Mas o problema não é esse. O problema é a aplicação feita de maneira totalmente acoplada ao serviço, de forma que você não consiga depurar uma camada intermediária sem o serviço estar rodando. Na verdade, estou pedindo demais… que camada intermediária? Boa parte do código que vejo sequer tem uma separação de camadas bem definida. Dá para mover numa boa todo o código para o mesmo projeto do Visual Studio e compilar. As dependências são tão fortes que no fim tudo é um grande espaguete.
Conceitos como inversão de controle, alta coesão e baixo acoplamento sequer passaram pela cabeça do desenvolvedor que concebeu a aplicação. E agora tem outro sofrendo lá, tentando depurar o tal do serviço. Fala a verdade, leitor deste humilde blog, quantas vezes você já não passou por isso? Eu já passei muitas, e confesso, já fiz também muita aplicação incapaz de ser testada no passado. Graças a Deus a gente aprende a fazer certo, não é?
Fica aqui o toque, na verdade, o pedido meu: quando você for construir uma aplicação, principalmente se for um serviço NT, faça uma camada de negócios, separe as responsabilidade, e sendo possível, crie um façade, ou melhor ainda, um service layer, que ajuda muito. O próximo desenvolvedor agradece.
Giovanni Bassi
Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.