Git Product home page Git Product logo

topshelfhosting's Introduction

Build

TopshelfHosting

Do you want to write services the dotnet core way, using the IHostedService interface? Do you also like the convenience of running windows services using Topshelf? Then use this extension method to run your generic host as a Topshelf service.

Install

Topshelf.Extensions.Hosting is available as a Nuget-package. From the Package Manager Console enter:

    Install-Package Topshelf.Extensions.Hosting

How to use

Build a generic host the normal way. Use the HostBuilder class as you normally do when building an console app. Replace the .RunAsConsole call with a call to the .RunAsTopshelfService extension method.

First create a service that inherits from IHostedService

        class FileWriterService : IHostedService, IDisposable

Then build the generic host to host the service above.

        var builder = new HostBuilder()
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<FileWriterService>();
            });

The last thing to run this as a Topshelf service is to call the RunAsTopshelfService extension method.

        builder.RunAsTopshelfService(hc =>
        {
            hc.SetServiceName("GenericHostInTopshelf");
            hc.SetDisplayName("Generic Host In Topshelf");
            hc.SetDescription("Runs a generic host as a Topshelf service.");
        });

You'll configure the windows service using the callback on the method. Configuration is done the normal Topshelf way.

Contribution

I'll be more than happy to get contributions!!!

topshelfhosting's People

Contributors

erizet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

topshelfhosting's Issues

install service issue

Hi, nice work, was so easy to add your code to make installation work, but i have some issue.

After use stardard installation:

dotnet ./MyService.dll install

i saw that topshelf assume that there is a executable called ./MyService.exe, and when service start, an error appears.

Instead of manually ack the install, do u have any workaround ?

Start up errors don't dispose host container

Hi,
I have found that errors thrown during start up don't cause the host container to be disposed. For my use case this means my error logs from that time don't end up getting flushed. I am using .NET Core 2.2

Example code:

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Topshelf.Extensions.Hosting;

namespace ConsoleApp2
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //await CreateHostBuilder(args).RunConsoleAsync();

            CreateHostBuilder(args).RunAsTopshelfService(s =>
            {
                s.SetServiceName("Name");
                s.SetDisplayName("Name");
            });
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return new HostBuilder()
                .ConfigureServices((h, s) => s
                    .AddHostedService<MyService>()
                    .AddSingleton<Service>());
        }
    }

    public class MyService : IHostedService
    {
        private readonly Service _service;

        public MyService(Service service)
        {
            _service = service;
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _service.DoSomething();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

    public class Service : IDisposable
    {
        public void DoSomething()
        {
            throw new Exception("Break things");
        }

        public void Dispose()
        {
            // Breakpoint here
        }
    }
}

When I use RunAsConsoleAsync the start up error cleans up the container, ultimately hitting the breakpoint in the service dispose. With the RunAsTopShelfService extension this doesn't happen.

Thanks,
Adam

Background information: I initially raised this as a Serilog bug until I identified the container issue through their guidance. serilog/serilog-extensions-hosting#15

Problem with reading appsettings file using Host.CreateDefaultBuilder

Creating a default host builder via this api
var builder = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
it does not load appsettings.json settings.

This is due to CreateDefaultBuilder setting the content root to
builder.UseContentRoot(Directory.GetCurrentDirectory());
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.0
and at that time GetCurrentDirectory is c:\windows\system32

Support for CancellationToken

Hi Erik,

Thanks for this nice and handy utility!

I have a feature request... I would like the CancellationToken that is passed into the StartAsync and StopAsync methods of the IHostedService to have its IsCancellationRequested property set to true when the service is stopped, so that I can cancel long running jobs and wait for them to finish.
I am more than happy to submit a PR if you like.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.