メッセージ キューイング (RabbitMQ を使用) に MassTransit を使用し、IoC として Castle Windsor を使用し、アプリを Windows サービスとして実行するために Topshelf を使用しています。
しかし、私はこの問題に遭遇しました。これは私にとって非常に奇妙です。
これは私のコードです
サービスがあります
public class TestService : IService
{
public void Start() {}
public void Stop() {}
}
ここに私のメインコードがあります(トップシェルフのセットアップはどこですか)
public class Program
{
public static IWindsorContainer;
public static void Main()
{
Container = new WindsorContainer();
Container.Register(
Component.For<IServiceBus>().Named("serviceBus").UsingFactoryMethod(CreateServiceBus()).LifeStyle.Singleton,
Component.For<IService>().ImplementedBy<SmppListenerService>().Named("test").LifeStyle.Singleton
);
Logger.Trace("Before Resolving");
var bus = Container.Resolve<IServiceBus>("serviceBus");
var service = Container.Resolve<IService>("test");
Logger.Trace("After Resolving");
HostFactory.Run(x =>
{
x.Service<IService>(config =>
{
config.ConstructUsing(o => service);
config.WhenStarted(o => { o.Start(); });
config.WhenStopped(o => { Container.Dispose(); } );
});
x.RunAsLocalSystem();
x.SetServiceName("test");
x.SetDescription("test d");
x.SetDisplayName("test dn");
});
}
}
このコードはデバッグ時にのみ機能しますが、サービスとして実行すると、制御機能に応答しなかったと Windows が言うまで例外なくサービス バスの解決で停止します。1 回目は機能し、2 回目は機能せず、3 回目は機能することに注意してください。
理由はわかりませんが、IoC の外部で IServiceBus を作成すると、うまく機能します。
ありがとう
ペイマン