Skip to content

🎩 Simple Windows Service helper (Topshelf-based, Azure Web Job capable)

License

Notifications You must be signed in to change notification settings

rebus-org/Topper

Repository files navigation

Topper

install from nuget

Generic Windows service host - makes an ordinary Console Application hostable in the following scenarios:

  • To be F5-debugged locally - on your developer machine
  • To be installed as a Windows Service - on the servers in your basement
  • To be executed as an Azure Web Job - in the cloud!!

Based on Topshelf. Exposes a drastically simplified API, where "services" are simply factories that return something IDisposable.

Targets .NET Standard 2.0, so you must target either netcoreapp2.0 (or later), or net462 (or later) in your Console Application.

Getting started

Create YourNewAwesomeWindowsService as a Console Application project targeting AT LEAST .NET 4.6.2 or .NET Core App 2.0.

Include the NuGet package 📦

Install-Package Topper -ProjectName YourNewAwesomeWindowsService

and clean up your Program.cs so it becomes nice like this: 🌻

namespace YourNewAwesomeWindowsService
{
    class Program
    {
        static void Main()
        {
                
        }
    }
}

and then you configure Topper by going

var configuration = new ServiceConfiguration()
	.Add(.. function that returns an IDisposable ..)
	.Add(.. another function that returns an IDisposable ..);

ServiceHost.Run(configuration);

in Main, which could look like this:

namespace YourNewAwesomeWindowsService
{
    class Program
    {
        static void Main()
        {
            var configuration = new ServiceConfiguration()
                .Add(() => new MyNewAwesomeService());

            ServiceHost.Run(configuration);                
        }
    }
}

🐵 Easy!

Topper uses LibLog ⚡ to log things. If you want to use Serilog, you probably want to

Install-Package Serilog.Sinks.ColoredConsole -ProjectName YourNewAwesomeWindowsService

and configure the global 🌍 logger before starting your service:

namespace YourNewAwesomeWindowsService
{
    class Program
    {
        static void Main()
        {
            Log.Logger = new LoggerConfiguration()
                .WriteTo.ColoredConsole()
                .CreateLogger();

            var configuration = new ServiceConfiguration()
                .Add(() => new MyNewAwesomeService());

            ServiceHost.Run(configuration);                
        }
    }
}

And that is how you use Topper.

How to run locally?

Press F5 or CTRL+F5 in Visual Studio.

Run the .exe

How to run as Windows Service?

Open an elevated command prompt, and run the .exe with the install argument, like so:

C:\apps\YourApp> YourApp.exe install

and then some Windows Service Control 🚥 stuff will appear and tell you some details on how it was installed.

You can remove it again like this:

C:\apps\YourApp> YourApp.exe uninstall

Not exactly surprising. 👏

How to run as Azure Web Job?

Just run it as you would any other Console Application as a Continuous Web Job.

Topper automatically monitors for the presence of the WEBJOBS_SHUTDOWN_FILE, to be able to shut down gracefully and dispose your IDisposables. ♻️