0

メッセージ キューイング (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 を作成すると、うまく機能します。

ありがとう

ペイマン

4

1 に答える 1

1

コンテナーのセットアップは、サービスの ConstructUsing() メソッドで、Topshelf 構成内で行う必要があります。Service クラスがコンテナーを保持するようにしてください。

于 2014-06-30T17:46:10.060 に答える