0

我使用 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 时,它的效果很好。

谢谢

佩曼

4

1 回答 1

1

容器设置必须在 Topshelf 配置中,在服务的 ConstructUsing() 方法中完成。尝试让您的 Service 类包含容器。

于 2014-06-30T17:46:10.060 回答