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, поэтому я не думаю, что это должно быть проблемой.

Другие вопросы по тегам