Как начать работу с TopShelf

Я недавно обнаружил TopShelf. Из всего, что я прочитал, выглядит очень круто. Единственная проблема в том, что я не смог его использовать. Я должен что-то пропустить. Ниже мой код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;

namespace TestTopShelf {
public class FooBar {
    public FooBar() {

    }

    public void Start() { }
    public void Stop() { }
}

public class Program {
    public static void Main() {
        HostFactory.Run(x => {

            x.Service<FooBar>( s => { 

            });
        });
    }
}
}

Вы можете видеть, что это немного неполноценно. Когда я пытаюсь установить свойства объекта 's' для ConstructUsing, WhenStarted и WhenStopped Visual Studio не выводит правильный тип. Я новичок в лямбда-выражениях и еще новее в TopShelf, поэтому я не уверен, что делаю.

Я использую эту страницу в документации TopShelf, чтобы начать работу. Это выглядит довольно прямо, поэтому я не уверен, что я пропустил.


обновленный код


using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;

namespace KeithLink.Svc.Windows.OrderService2 {
class FooBar {
    public FooBar() { }

    public void Start() { }
    public void Stop() { }
}

class Program {
    static void Main(string[] args) {
        HostFactory.Run(x => {

            x.Service<FooBar>(s => {
                s.ConstructUsing(name => new OrderService());
                s.WhenStarted(os => os.Start());
                s.WhenStopped(os => os.Stop());
            });

            x.RunAsLocalSystem();

            x.SetDescription("some service description");
            x.SetServiceName("ServiceName");
            x.SetDisplayName("Service Display Name");
        });
    }
}
}

2 ответа

Решение

Хотя intellisense VisualStudio не выводит правильный тип, он все равно должен компилироваться. Я не знаю, что делает верхняя полка, но я помню, что эти проблемы возникали в последний раз, когда я пытался ее использовать.

Когда вы хотите "зарегистрировать" службу для запуска при запуске с TopShelf, вы вызываете Service<T>.Run метод - который вы, кажется, начали. В этом методе вы прошли по HostConfigurator объект, который вы можете рассказать (настроить) TopShelf о вашем сервисе. Существуют различные вещи, которые вы можете настроить в своем сервисе, но вы, как правило, хотите рассказать ему, как создать экземпляр вашего сервиса и как его остановить и запустить. Вы делаете это, передавая "код", который делает эти вещи. Вы можете использовать лямбду для этого, например:

public static void Main() {
    HostFactory.Run(x => {

        x.Service<FooBar>( s => { 
            s.ConstructUsing(name => new FooBar());
            s.WhenStarted(fb => fb.Start());
            s.WhenStopped(fb => fb.Stop());
        });
        x.RunAsLocalSystem(); // use the local system account to run as

        x.SetDescription("My Foobar Service");  // description seen in services control panel
        x.SetDisplayName("FooBar"); // friendly name seen in control panell
        x.SetServiceName("foobar"); // used with things like net stop and net start
    });
}

Этот код не обязательно должен быть лямбда-выражением, для этого можно создать методы (например, это может быть более понятно):

    private static void Main(string[] args)
    {
        HostFactory.Run(x =>
        {
            x.Service<FooBar>(s =>
            {
                s.ConstructUsing(CreateService);
                s.WhenStarted(CallStart);
                s.WhenStopped(CallStop);
            });
            x.RunAsLocalSystem(); // use the local system account to run as

            x.SetDescription("My Foobar Service");  // description seen in services control panel
            x.SetDisplayName("FooBar"); // friendly name seen in control panell
            x.SetServiceName("foobar"); // used with things like net stop and net start
        });
    }

    private static void CallStop(FooBar fb)
    {
        fb.Stop();
    }

    private static void CallStart(FooBar fb)
    {
        fb.Start();
    }

    private static FooBar CreateService(HostSettings name)
    {
        return new FooBar();
    }

Это начинает наиболее или менее FooBar класс, если есть что-то более конкретное, пожалуйста, обновите свой вопрос.

С этими именованными методами, когда TopShelf начинает работать (после вызова HostFactory.Run) ваш CreateSearch метод будет вызван, то ваш CallStart метод будет вызван, и когда служба остановлена, ваш CallStop будет называться.

Другие вопросы по тегам