gpt4 book ai didi

c# - 为什么在使用 TypesToScan() 后 NServiceBus 配置被破坏

转载 作者:太空狗 更新时间:2023-10-30 01:03:26 25 4
gpt4 key购买 nike

我有一个控制台应用程序,您可以在其中指定参数,根据指定的参数将加载各种处理程序。例如:

prgm.exe nyse 
prgm.exe nasdaq

目标是在我的代码中有 INyseHandlersINasdaqHandlers 并且在第一种情况下只加载任何扩展前者的处理程序,与后者的情况类似.目标是让一个程序可以根据其运行方式收听各种或所有来源。为实现这一点,我已经按照上面提到的方式设置了我的接口(interface)。然后在我的配置中设置:

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(assemblies) 并且没有在其中包含 NServiceBus 程序集时,传输无法初始化。一旦我添加了 NServiceBus.* 程序集,一切就开始工作了。

关于c# - 为什么在使用 TypesToScan() 后 NServiceBus 配置被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29081094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com