我正在使用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服务中,我似乎 UnicastBus
的 transport
成员始终为空,因此第824行 transport.MaxThroughputPerSecond = license.MaxThroughputPerSecond;
落空 .
对象引用未设置为对象的实例 . 位于c:\ TeamCity \ buildAgent \ work \ nsb.master_2 \ src \ unicast \ NServiceBus.Unicast \ UnicastBus.cs中的NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction):位于Access.Cloud.WebService的第824行l:\ Projects \ aCloud \ InsightIntegration \ Access.Cloud.WebService \ Modules \ NServiceBusModule.cs中的.Modules.NServiceBusModule.CreateBus():位于l的Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext context)中的第47行:\ Projects \ aCloud \ InsightIntegration \ Access.Cloud.WebService \ Modules \ NServiceBusModule.cs:第25行,位于C:\ Projects \ Ninject \ ninject \ src \ Ninject \中的Ninject.Activation.Provider'1.Create(IContext context) Activation \ Provider.cs:Ninject.Activation.Context.Resolve()中的第38行,位于c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Context.cs:第157行,位于System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext ()System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()的System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1 source)
我也在调试器中检查了它,确定 transport
为空 .
我有点环保,但我认为传输只是来自于调用 MsmqTransport()
时设置的一些绑定 . 我尝试将从Ninject Web引导程序加载模块的代码移动到Global.asax,但它没有什么区别 .
任何帮助或指导赞赏!
1 回答
问题是您正在使用该方法来创建对总线的引用 . 您正在使用的方法应该在进程启动时调用一次,就是这样 .
修复方法是将总线变量存储在该类的字段中,然后在容器注册中使用该字段,如下所示: