1

迁移到 NServiceBus 4(从 3.3.7 到 4.0.5)后,我正在尝试运行我的自定义 Saga Persister。我在容器中注册它(我在整个 Web 应用程序中使用的容器),但是在应用程序启动期间我得到了异常:

[ComponentResolutionException:看起来您正在尝试解决一个组件,该组件(直接或间接)依赖于生活方式组件是 PerWebRequest。当前执行的代码不在 Web 请求范围内。分析您的依赖项并更改它们的生活方式(到 signletons)或它们的依赖项。] c:\tfs\Main\src\AppName2\ 中的 CustomApp.Mapping.WebRequestFallingBackToCallContextScopeAccessor.GetScope(CreationContext context) CustomApp\CustomApp.Mapping\WebRequestFallingBackToCallContextScopeAccessor.cs:40 Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.GetScope(CreationContext context) +33 Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy) +84 Castle.MicroKernel.Handlers。 DefaultHandler.ResolveCore(CreationContext 上下文,1.ForEach(Action1 个动作)+14013700 NServiceBus.Configure.Initialize() 在 c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Configure.cs:374 NServiceBus.Configure.CreateBus() 在 c:\BuildAgent\work\d4de8921a0aabf04\ src\NServiceBus.Core\Configure.cs:307 CustomApp.Web.Initialization.BusInstaller.Install(IWindsorContainer container, IConfigurationStore store) 在 c:\tfs\Main\src\AppName2\CustomApp\CustomApp.Web\Initialization\BusInstaller.cs :56 Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] 安装程序,DefaultComponentInstaller 范围) +216 Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] 安装程序) +124 CustomApp.Web.WindsorContainerProvider.GetInitializedContainer() 在 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() 在 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

经过一周的调查,我的应用程序中的容器初始化过程似乎有点奇怪。在 NSB 启动期间容器未完全初始化,因此无法解析某些依赖项,导致上述异常的原因。

我通过使我的 CustomSagaPersister 的依赖项可选(属性注入)来解决这个问题,所以当 CustomSagaPersister 由 DisplayInfrastructureServicesStatus 解决时,应用程序不会崩溃(依赖项没有注入,但由于我们只检查注册的内容而不是实际使用它,这是好的)。

另一种解决方法是从 NSB 中删除 DisplayInfrastructureServicesStatus 并对其进行自定义编译。

于 2013-10-16T07:56:53.443 回答