1

NServiceBus 4 (3.3.7 から 4.0.5) に移行した後、カスタムの Saga Persister を実行しようとしています。コンテナー (Web アプリケーション全体で使用するもの) に登録していますが、アプリケーションの起動中に例外が発生します:

[ComponentResolutionException: ライフスタイルであるコンポーネントに (直接的または間接的に) 依存するコンポーネントを解決しようとしているようです。これは PerWebRequest です。現在実行されているコードは Web リクエスト スコープ内にありません。依存関係を分析し、ライフスタイルを (signletons に) 変更するか、依存関係を変更してください。 CustomApp\CustomApp.Mapping\WebRequestFallingBackToCallContextScopeAccessor.cs:40 Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.GetScope(CreationContext コンテキスト) +33 Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.Resolve(CreationContext コンテキスト、IReleasePolicy releasePolicy) +84 Castle.MicroKernel.Handlers。 DefaultHandler.ResolveCore(CreationContext コンテキスト、1.ForEach(Action1 アクション) +14013700 NServiceBus.Configure.Initialize() in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Configure.cs:374 NServiceBus.Configure.CreateBus() in c:\BuildAgent\work\d4de8921a0aabf04\ c:\tfs\Main\src\AppName2\CustomApp\CustomApp.Web\Initialization\BusInstaller.cs の src\NServiceBus.Core\Configure.cs:307 CustomApp.Web.Initialization.BusInstaller.Install (IWindsorContainer コンテナー、IConfigurationStore ストア) :56 Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] インストーラー、DefaultComponentInstaller スコープ) +216 Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] インストーラー) +124 CustomApp.Web.WindsorContainerProvider.GetInitializedContainer() in c:\tfs\ Main\src\AppName2\CustomApp\CustomApp.Web\WindsorContainerProvider.cs:87 CustomApp.Web.MvcApplication.c:\tfs\Main\src\AppName2\CustomApp\CustomApp.Web\Global.asax.cs:265 の GetInitializedContainer() c:\tfs\Main\src\AppName2\CustomApp の CustomApp.Web.MvcApplication.Application_Start() \CustomApp.Web\Global.asax.cs:139 CustomApp.Administration.Web.Global.Application_Start() in c:\tfs\Main\src\AppName2\CustomApp\Administration\CustomApp.Administration.Web\Global.asax.cs :11

この問題を解決する方法はありますか? 同じコードベースでスムーズに動作 NServiceBus 3.3.7

編集: これは私がNSBを初期化する方法です:

 Configure.Serialization.Xml();
 Configure.Features.Enable<SecondLevelRetries>(); 
 Configure.Features.Enable<TimeoutManager>();
 Configure.Features.Enable<Sagas>();

 var conf = Configure.With(assemblies)
     .CustomConfigurationSource(new BusConfigSource(assemblies))
     .DefineEndpointName(ConfigurationManager.AppSettings["EndpointName"])
     .CastleWindsorBuilder(container)
     .UseTransport<Msmq>()
     .UseInMemoryTimeoutPersister()
     .PurgeOnStartup(false)
     .FileShareDataBus(WebConfigurationManager.AppSettings["NServiceBusFileShare"])
     .UnicastBus()
     .LoadMessageHandlers()
     .MsmqSubscriptionStorage();
 conf.Configurer.ConfigureComponent<CustomSagaPersister>(DependencyLifecycle.InstancePerCall);
 conf.CreateBus().Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());

また、 CustomSagaPersiter をコンテナに手動で追加し、呼び出さずにアプローチを試みました

conf.Configurer.ConfigureComponent<CustomSagaPersister>(DependencyLifecycle.InstancePerCall);

しかし、結果は同じです。

4

1 に答える 1

0

1 週間の調査の結果、アプリケーションのコンテナーの初期化プロセスが少しおかしいようです。NSB の起動時にコンテナが完全に初期化されていないため、一部の依存関係を解決できず、前述の例外が発生します。

この問題を回避するには、CustomSagaPersister の依存関係をオプション (プロパティ インジェクション) にすることで、CustomSagaPersister が DisplayInfrastructureServicesStatus によって解決されたときにアプリがクラッシュすることはありません (依存関係はインジェクトされませんが、登録されているものだけを確認し、実際には使用していないため、これはわかった)。

もう 1 つの回避策は、NSB から DisplayInfrastructureServicesStatus を削除し、それをカスタム コンパイルすることです。

于 2013-10-16T07:56:53.443 に答える