Как начать работу с 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
будет называться.