0

NServiceBus 3.3.3 を使用しています。コンテナーとして Ninject を使用しており、次のメソッドにバインドしてモジュール内のバスを初期化しています。

Bind<IBus>().ToMethod(context =>
{
    return CreateBus();
}).InSingletonScope();



private IBus CreateBus()
{
    var bus = NServiceBus.Configure.With()
    .NinjectBuilder(this.Kernel)
    .DefineEndpointName("MyEndpointName")
    .MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
    .DisableRavenInstall()
.DisableTimeoutManager()
    .InMemorySubscriptionStorage()
    .XmlSerializer()
    .UnicastBus()
    .ImpersonateSender(false)
    .CreateBus();

    return bus.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
}

同じコードが別の (MVC4) プロジェクトで正常に動作しますが、私の WCF WAS サービスでは、のtransportメンバーUnicastBusが常に null であるため、824 行目が失敗するようtransport.MaxThroughputPerSecond = license.MaxThroughputPerSecond;です。

オブジェクト参照がオブジェクト インスタンスに設定されていません。NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction) c:\TeamCity\buildAgent\work\nsb.master_2\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 824 at Access.Cloud.WebService .Modules.NServiceBusModule.CreateBus() in l:\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs:line 47 at Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext context) in l :\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs: c:\Projects\Ninject\ninject\src\Ninject\ の Ninject.Activation.Provider'1.Create(IContext context) の 25 行目Activation\Provider.cs: c の Ninject.Activation.Context.Resolve() の 38 行目:
System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 ソース) で System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() で

私もデバッガーでそれをチェックしましたが、十分transportにnullであることを確認してください。

私はそれが何か環境的なものだと推測していますが、トランスポートMsmqTransport()は が呼び出されたときにセットアップされるいくつかのバインディングから来ているだけだと思います。モジュールをロードするコードを Ninject Web ブートストラップから Global.asax に移動しようとしましたが、違いはありませんでした。

ヘルプやガイダンスをいただければ幸いです。

4

1 に答える 1

3

問題は、そのメソッドを使用してバスへの参照を作成していることです。使用しているメソッドは、プロセスの起動時に一度呼び出す必要があります。それだけです。

修正するには、バス変数をそのクラスのフィールドに格納し、次のようにコンテナー登録でそのフィールドを使用します。

Bind<IBus>().ToMethod(context =>
{
    return bus;
}).InSingletonScope();
于 2012-12-18T15:51:48.347 に答える