我正在使用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
的{{1}}成员始终为null,因此第824行UnicastBus
下降结束了。
对象引用未设置为对象的实例。在NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction) C:\ TeamCity的\ buildAgent \工作\ nsb.master_2 \ SRC \单播\ NServiceBus.Unicast \ UnicastBus.cs:线 824在 Access.Cloud.WebService.Modules.NServiceBusModule.CreateBus()in L:\项目\ aCloud \ InsightIntegration \ Access.Cloud.WebService \模块\ NServiceBusModule.cs:行 47点 Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext 上下文) L:\项目\ aCloud \ InsightIntegration \ Access.Cloud.WebService \模块\ NServiceBusModule.cs:行 25在Ninject.Activation.Provider'1.Create(IContext context)中 c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Provider.cs:第38行 在Ninject.Activation.Context.Resolve()中 c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Context.cs:第157行 在System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
在System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1 来源) System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()
我也在调试器中检查了它,确定transport.MaxThroughputPerSecond = license.MaxThroughputPerSecond;
为空。
我猜它是环境的东西,但我认为传输只是来自调用transport
时设置的一些绑定。我尝试将从Ninject Web引导程序加载模块的代码移动到Global.asax,但它没有什么区别。
感谢任何帮助或指导!
答案 0 :(得分:3)
问题是您正在使用该方法创建对总线的引用。您正在使用的方法应该在流程启动时调用一次即可。
修复方法是将总线变量存储在该类的字段中,然后在容器注册中使用该字段,如下所示:
Bind<IBus>().ToMethod(context =>
{
return bus;
}).InSingletonScope();