Simple library that allows one to host dot net core application as windows services. Perfect solution to power micro-services architecture.
This library was created to enable one to host CONSOLE dot net core applications. If you want to host a WEBSITE as a service, you're better of following https://docs.microsoft.com/en-us/aspnet/core/hosting/windows-service
Using NuGet:
Install-Package PeterKottas.DotNetCore.WindowsService
Easiest way to start is using a brand new template. Just do:
dotnet new -i PeterKottas.DotNetCore.WindowsService.Templates::*
This will add one template at the moment.
Follow up with this
mkdir NameOfYourProject
cd NameOfYourProject
dotnet new [ mcrsvc-min | mcrsvc-std ]
This will create a sample project for you. Next chapter explains its features in more details especially points 6 onwards if you used the template.
Community, feel encouraged to add more templates if you find something missing/usefull. I'll be more than happy to add these. Just copy the project in https://github.com/PeterKottas/DotNetCore.WindowsService/tree/master/Source/Templates/PeterKottas.DotNetCore.WindowsService.MinimalTemplate and follow instructions in https://github.com/dotnet/templating if you need more specific behvaiour.
-
Create .NETCore console app.
-
Create your first service, something like this:
public class ExampleService : IMicroService { public void Start() { Console.WriteLine("I started"); } public void Stop() { Console.WriteLine("I stopped"); } }
-
You can also inherit MicroService base class and take advantage of built in timers:
public class ExampleService : MicroService, IMicroService { public void Start() { this.StartBase(); Timers.Start("Poller", 1000, () => { Console.WriteLine("Polling at {0}\n", DateTime.Now.ToString("o")); }, (e) => { Console.WriteLine("Exception while polling: {0}\n", e.ToString()); }); Console.WriteLine("I started"); } public void Stop() { this.StopBase(); Console.WriteLine("I stopped"); } }
-
Api for services (and yeah, it's simmilar to Topshelf, thanks for inspiration, I just couldn't wait for you guys to implement this):
ServiceRunner<ExampleService>.Run(config => { var name = config.GetDefaultName(); config.Service(serviceConfig => { serviceConfig.ServiceFactory((extraArguments, microServiceController) => { return new ExampleService(); }); serviceConfig.OnStart((service, extraArguments) => { Console.WriteLine("Service {0} started", name); service.Start(); }); serviceConfig.OnStop(service => { Console.WriteLine("Service {0} stopped", name); service.Stop(); }); serviceConfig.OnInstall(service => { Console.WriteLine("Service {0} installed", name); }); serviceConfig.OnUnInstall(service => { Console.WriteLine("Service {0} uninstalled", name); }); serviceConfig.OnPause(service => { Console.WriteLine("Service {0} paused", name); }); serviceConfig.OnContinue(service => { Console.WriteLine("Service {0} continued", name); }); serviceConfig.OnShutdown(service => { Console.WriteLine("Service {0} shutdown", name); }); serviceConfig.OnError(e => { Console.WriteLine("Service {0} errored with exception : {1}", name, e.Message); }); }); });
-
Optionally set the name of the service like this:
ServiceRunner<ExampleService>.Run(config => { config.SetName("MyTestService"); });
-
Run the service without arguments and it runs like console app.
-
Run the service with action:install and it will install the service.
-
Run the service with action:uninstall and it will uninstall the service.
-
Run the service with action:start and it will start the service.
-
Run the service with action:stop and it will stop the service.
-
Run the service with action:pause and it will pause the service.
-
Run the service with action:continue and it will continue the service.
-
Run the service with username:YOUR_USERNAME, password:YOUR_PASSWORD and action:install which installs it for the given account.
-
Run the service with built-in-account:(NetworkService|LocalService|LocalSystem) and action:install which installs it for the given built in account. Defaults to LocalSystem.
-
Run the service with description:YOUR_DESCRIPTION and it setup description for the service.
-
Run the service with display-name:YOUR_DISPLAY_NAME and it setup Display name for the service.
-
Run the service with name:YOUR_NAME and it setup name for the service.
-
Run the service with start-immediately:(true|false) to start service immediately after install. Defaults to true.
-
You can find the complete example in PeterKottas.DotNetCore.Example project.
-
Install the service using powershell:
dotnet.exe $serviceDllPath action:install
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D
Huge thanks goes to @dasMulli the guy behind a useful lib which is one of the dependecies for this library.