ncqrs с NServiceBus 3.3
После обновления NServiceBus с 2.6 до 3.3 CommandService начал кидать System.NullReferenceException: Object reference not set to an instance of an object.
на IStartableBus.Start()
, Небольшое исследование показало, что UnicastBus вернулся Configure.CreateBus()
имеет значение null в качестве значения свойства транспорта.
В Global.asax.cs есть Конфигурация NSB:
IBus bus = Configure.With()
.DefineEndpointName(endpointName)
.UnityBuilder(unityContainer)
.AddLogger()
.BinarySerializer()
.MsmqTransport()
.PurgeOnStartup(false)
.IsTransactional(true)
.IsolationLevel(TransactionIsolationLevel)
.TransactionTimeout(TimeSpan.FromMinutes(TransactionTimeout))
.UnicastBus()
.ImpersonateSender(true)
.LoadMessageHandlers()
.MsmqSubscriptionStorage()
.InstallNcqrs()
.CreateBus()
.Start();
public class NcqrsNsbConfigure : NServiceBus.Configure
{
private NsbCommandService _commandService;
private InProcessEventBus _inProcessEventBus;
public static NcqrsNsbConfigure InstallNcqrs(NServiceBus.Configure config)
{
var configNcqrs = new NcqrsNsbConfigure();
configNcqrs.Install(config);
return configNcqrs;
}
public void Install(NServiceBus.Configure config)
{
Builder = config.Builder;
Configurer = config.Configurer;
NcqrsEnvironment.Configure(new NsbEnvironmentConfiguration(Builder));
var compositeBus = new CompositeEventBus();
_inProcessEventBus = new SafeInProcessEventBus();
compositeBus.AddBus(_inProcessEventBus);
compositeBus.AddBus(new NsbEventBusWrapper());
NcqrsEnvironment.SetDefault<IEventBus>(compositeBus);
_commandService = new NsbCommandService();
var safeCommandService = new NSBCommandService(NcqrsEnvironment.Get<IBus>(), _commandService);
config.Configurer.RegisterSingleton(typeof(Ncqrs.Commanding.ServiceModel.ICommandService), safeCommandService);
}
public NcqrsNsbConfigure RegisterExecutor<TCommand>(ICommandExecutor<TCommand> executor) where TCommand : Ncqrs.Commanding.ICommand
{
_commandService.RegisterExecutor(executor);
return this;
}
public NcqrsNsbConfigure RegisterInProcessEventHandler<TEvent>(IEventHandler<TEvent> handler) where TEvent : Ncqrs.Eventing.IEvent
{
_inProcessEventBus.RegisterHandler(handler);
return this;
}
public NcqrsNsbConfigure RegisterInProcessEventHandler(Type eventType, Action<Ncqrs.Eventing.IEvent> handler)
{
_inProcessEventBus.RegisterHandler(eventType, handler);
return this;
}
public NcqrsNsbConfigure RegisterAllInProcessEventHandlers(Assembly asm)
{
_inProcessEventBus.RegisterAllHandlersInAssembly(asm);
return this;
}
}
Кто-нибудь сталкивался с этим и нашел решение?
1 ответ
Я не использовал NCQRS, но я предполагаю, что у вас есть утечка истинного объекта конфигурации.
Когда вы звоните .InstallNcqrs()
(и не должен ли это быть метод расширения для того, чтобы заставить свободно конфигурируемую конфигурацию компилироваться?) вы не возвращаете переданный в NServiceBus.Configure объект, вы возвращаете свой собственный объект NcqrsNsbConfigure. Конечно, вы предоставляете Builder и Configurer для соответствия входящему объекту Configure, но, возможно, вы пропускаете какой-то другой элемент, который теперь ожидает остальная часть конвейера NServiceBus.
Я попытался бы перестроить ваш код так, чтобы вы инициализировали то, что вам нужно, в NCQRS, но затем вернули исходный объект Configure. Вы не используете возвращенный объект для вызова других беглых методов для настройки NCQRS, поэтому я не думаю, что это должно быть проблемой.