我使用 MassTransit 进行消息队列(使用 RabbitMQ),Castle Windsor 作为我的 IoC,Topshelf 将我的应用程序作为 Windows 服务运行。
但是我遇到了这个对我来说很奇怪的问题。
这是我的代码
我有服务
public class TestService : IService
{
public void Start() {}
public void Stop() {}
}
这是我的主要代码(设置 Topshelf 在哪里)
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 说它没有响应控制功能。请注意,它第一次有效,第二次无效,第三次有效,依此类推。
我不明白为什么,但是当我在 IoC 之外创建 IServiceBus 时,它的效果很好。
谢谢
佩曼