Quem precisou criar serviços Windows sabe a complexidade que é usar o Windows Services no desenvolvimento, para resolver isso um grupo criou o TopShelf. Nele é possível utilizar uma aplicação console para transformá-la em serviço.
Os desenvolvedores dizem que a justificativa é que é mais fácil depurar uma aplicação console do que um serviço.
Montando um exemplo no TopShelf
Para usar vamos começar criando um projeto console básico para iniciar nosso projeto com o TopShelf.
O segundo passo é instalar o repositório Nuget do TopShelf, vamos entrar no Manage Nuget Packges e procurar por ele.
Show me the code!
Após isto nosso aplicativo console já está preparado para virar um serviço, vamos começar a montar nossa aplicação teste. Abaixo tem um exemplo de implementação para mostrar como usar o TopShelf.
public class TownCrier { readonly Timer _timer; public TownCrier() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("São {0} e está tudo bem!", DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } class Program { static void Main(string[] args) { var rc = HostFactory.Run(x => //1 { x.Service<TownCrier>(s => //2 { s.ConstructUsing(name => new TownCrier()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 x.SetDescription("Exemplo Topshelf Host"); //7 x.SetDisplayName("Stuff"); //8 x.SetServiceName("Stuff"); //9 }); //10 var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); //11 Environment.ExitCode = exitCode; } }
Vamos entender como funciona, abaixo vou descrever cada passo dos comentários:
1 – Aqui é configurando o host usando o HostFactory.Run para executar. Abrimos uma nova expressão lambda onde o ‘x’ neste caso expõe toda a configuração do nível do host. Usando essa abordagem, os argumentos de comando são extraídos das variáveis de ambiente. Também capturamos o código de retorno do serviço que é retornado na linha 11;
2 – Aqui estamos dizendo ao TopShelf que existe um serviço do tipo ‘TownCrier’. A expressão lambda que é aberta aqui expõe as opções de configuração do serviço através do parâmetro ‘s’;
3 – Isso diz ao TopShelf como criar uma instância do serviço. Atualmente, estamos apenas indo para “new”, mas nós poderíamos facilmente puxá-lo de um contêiner IoC com algum código que seria algo como ‘container.GetInstance <TownCrier> ()’;
4 – Aqui é informado ao TopShelf o que ele tem que executar quando iniciar o serviços;
5 – Já aqui é o que o TopShel tem que executar quando parar o serviço;
6 – Aqui está sendo configurado como o serviço vai rodar, no caso do exemplo ele está rodando no sistema local;
7 – Nessa linha é configurada a descrição que vai aparecer no monitor de serviços do Windows;
8 – Nessa linha é configurada o nome do serviço que é exibido no painel de serviços do Windows;
9 – Nessa linha é configurado o nome do serviço para ser usado via linha de comandos;
10 – Aqui acontece o fechamento da expressão lambda;
11 – Nessa linha converte o código no código de saída.
Agora se executar o código ele vai abrir normalmente a aplicação console e vai dar os seguintes retornos:
Instalação como serviço
A grande vantagem aqui é que você utiliza normal a aplicação, consegue de forma simples debugar ela sem problemas, e depois que tiver concluído ai é a hora de instalar ele como um serviço do Windows, para isso vamos até a pasta do executável, no meu caso está em “C:\Users\thiago.borges\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug” mais vai ser no diretório bin do seu projeto. Com o shift do teclado pressionado e clicando com o botão direito do mouse na pasta, você abre as opções avançadas, e então deve clicar em “Abrir janela de comando aqui” conforme abaixo:
Agora vamos executar linhas de comando para instalar a aplicação como serviço, é muito simples, basta chamar o seguinte comando: “ConsoleApp1.exe install” e pronto, o serviço vai ser instalado.
Se abrir o painel de Serviços do Windows, vai visualizar o serviço:
E se ao iniciar ele gera log normalmente no visualizador de eventos do Windows:
Remoção do serviço
E com o uso do TopShelf a remoção do serviços também acontece de maneira muito fácil, basta dar um “Console1.exe uninstall”, e pronto, serviço removido.
Conclusão
Como podemos ver é fácil utilizar o TopShelf, e como ele roda em cima de uma aplicação console, facilita muito o seu desenvolvimento, principalmente no que diz respeito a depuração.
Espero que tenha sido proveitoso, até a próxima.