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 服务中,我似乎总是为 null的transport成员,因此第 824 行失败。UnicastBustransport.MaxThroughputPerSecond = license.MaxThroughputPerSecond;

你调用的对象是空的。在 NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction) in c:\TeamCity\buildAgent\work\nsb.master_2\src\unicast\NServiceBus.Unicast\UnicastBus.cs:Access.Cloud.WebService 的第 824 行.Modules.NServiceBusModule.CreateBus() in l:\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs: 第 47 行 Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext context) in l :\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs:line 25 at Ninject.Activation.Provider'1.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\ Activation\Provider.cs:C 中 Ninject.Activation.Context.Resolve() 的第 38 行:
在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 源) 在 System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()

我也在调试器中检查过它,果然transport是空的。

我猜这是环境问题,但我认为传输只是来自一些在MsmqTransport()调用时设置的绑定。我尝试将加载模块的代码从 Ninject 网络引导程序移动到 Global.asax,但它没有任何区别。

任何帮助或指导表示赞赏!

4

1 回答 1

3

问题是您正在使用该方法来创建对总线的引用。您正在使用的方法应该在进程启动时调用一次,就是这样。

解决方法是将总线变量存储在该类的字段中,然后在容器注册中使用该字段,如下所示:

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