5

最近、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 => { 

            });
        });
    }
}
}

少し不完全であることがわかります。ConstructUsing、WhenStarted、および WhenStopped の 's' オブジェクトのプロパティを設定しようとすると、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");
        });
    }
}
}
4

2 に答える 2

4

VisualStudio の IntelliSense は正しい型を推測しませんが、コンパイルする必要があります。topshelf が何をしているのかはわかりませんが、最後に使用しようとしたときにこれらの問題が発生したことを覚えています。

于 2014-09-19T11:59:20.640 に答える
3

サービスを 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呼び出されます。

于 2014-09-17T21:51:49.703 に答える