c# – 使用TypesToScan()后,为什么NServiceBus配置中断
作者:互联网
我有一个控制台应用程序,您可以在其中指定参数,根据指定的参数将加载各种处理程序.例如:
prgm.exe nyse
prgm.exe nasdaq
目标是在我的代码中我有INyseHandlers和INasdaqHandlers,并且在第一种情况下只加载任何扩展前者的处理程序,类似于后者的情况.目标是让一个程序可以根据其运行方式收听各种或所有来源.为实现这一点,我已经设置了如上所述的接口.然后在我的配置设置中:
var configuration = new BusConfiguration();
configuration.InitializeStepBusConventions(); // extension method, not the problem
// Load all the handlers specified in command line arguments
if (!Args.Contains("any") && Args.Length != 0)
{
List<Type> handlersToLoad = new List<Type>();
foreach (var argument in Args)
{
Console.WriteLine("Adding {0} subscribers to loaded handlers. . .", argument.ToUpper());
switch (argument)
{
case "nyse":
AddToHandlerList(handlersToLoad, typeof(INyseProcessor));
break;
case "nasdaq":
AddToHandlerList(handlersToLoad, typeof(INasdaqProcessor));
break;
}
}
configuration.TypesToScan(handlersToLoad);
}
configuration.UseContainer<NinjectBuilder>(c => c.ExistingKernel(Kernel));
configuration.EndpointName(ConfigurationManager.AppSettings[Defaults.Project.DefaultEndPointName]);
NServiceBus.Logging.LogManager.Use<NLogFactory>();
Bus.Create(configuration).Start();
在哪里:
private void AddToHandlerList(List<Type> handlersToLoad, Type interfaceType)
{
List<Type> classesWhichExtendInterface = Assembly.GetExecutingAssembly().GetTypes().Where(t => interfaceType.IsAssignableFrom(t)).ToList();
classesWhichExtendInterface.Remove(interfaceType);
handlersToLoad.AddRange(classesWhichExtendInterface);
}
类型按预期加载,List很好.但是当我运行它并进入Bus.Start行时,我收到以下错误:
The given key (NServiceBus.LocalAddress) was not present in the dictionary.
如果没有类型加载,默认行为可以正常工作,并且加载程序集中的所有处理器.运行TypesToScan()行后为什么会出现此错误?
编辑:这是扩展方法:
config.UseSerialization<JsonSerializer>();
config.UseTransport<RabbitMQTransport>();
config.UsePersistence<InMemoryPersistence>();
config.EnableInstallers();
return config;
解决方法:
你的例外发生在这里
localAddress = Address.Parse(Settings.Get<string>("NServiceBus.LocalAddress"));
设置获取传输设置的“NServiceBus.LocalAddress”kvp.由于您没有使用“核心”传输(MSMQ),我可能会怀疑您的传输程序集类型需要包含在TypesToScan中,因为:
ForAllTypes<Feature>(TypesToScan, t => featureActivator.Add(t.Construct<Feature>()));
我在使用SQL Server传输时遇到了类似的问题,当我将程序集列表发送到With(程序集)并且不包含NServiceBus程序集时,传输无法初始化.一旦我添加了NServiceBus.*程序集,一切都开始工作了.
标签:c,nservicebus 来源: https://codeday.me/bug/20190609/1205602.html