У меня есть приложение консоли, в котором вы можете указать параметры, в зависимости от параметров, которые будут загружены различными обработчиками. Например:Почему конфигурация NServiceBus повреждена после использования TypeToScan()
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()
?
EDIT: Вот метод расширения:
config.UseSerialization<JsonSerializer>();
config.UseTransport<RabbitMQTransport>();
config.UsePersistence<InMemoryPersistence>();
config.EnableInstallers();
return config;
Я думаю, что, делая это, вы разрешаете ему получать ваши обработчики и все остальное, как сообщения, транспорты, конфигурации, удаляются. –
Я думаю, что это справедливое предположение, кажется, что 'TypeToScan' предполагает, что вы начинаете с нуля и полностью обрываете оставшиеся настройки по умолчанию. Любая идея, как я буду получать те, которые необходимы, чтобы сделать ее работоспособной? – mike
Я не уверен. Я бы предложил удалить ненужных обработчиков, когда список уже заполнен, но я не уверен, когда он будет правильным пересечением для размещения этого кода. Я все еще считаю, что разделение обработчиков на два разных проекта было бы самым простым. –