Проблемы интеграции nServiceBus с StructureMap

Я пытаюсь использовать StructureMap с nServiceBus.

Проект:

  • Использует конечную точку GenericHost для отправки командных сообщений
  • Настраивает nServiceBus с помощью StructMapBuilder.
  • Использует простую конфигурацию реестра StructureMap
  • Использует стартовый класс TestServer, поддерживающий IWantToRunAtStartup
  • Класс TestServer имеет зависимость ctor от класса TestManager
  • Класс TestManager имеет зависимость ctor от IBus

ObjectFactory.WhatDoIHave () показывает, что StructureMap знает, как создавать классы.

При запуске получаю ошибки накопления. nServiceBus похоже перезаписывает конфиг?

Обратите внимание, что когда я добавляю зависимость IBus ctor к своим обработчикам событий без какой-либо другой конфигурации, все выглядит нормально.

Ошибка:

Исключение при запуске конечной точки, ошибка была зарегистрирована. Причина: Ошибка создания объекта с именем 'nSeviceBusStructureMapTest.TestServer': неудовлетворенная зависимость, выраженная через аргумент конструктора с индексом 0 типа [nSeviceBusStructureMapTest.ITestManager]: не определен уникальный объект типа [nSeviceBusStructureMapTest.ITestManagerTest. ITestManager]: ожидается как минимум 1 соответствующий объект для подключения параметра [miningServiceManage] к конструктору объекта [nSeviceBusStructureMapTest.TestServer]

Источник:

using System;
using System.Diagnostics;
using NServiceBus;
using StructureMap;
using StructureMap.Configuration.DSL;

namespace nSeviceBusStructureMapTest
{
    public class TestSmRegistry : Registry
    {
        public TestSmRegistry()
        {
            For<ITestManager>().Use<TestManager>();
            For<TestServer>().Use<TestServer>();
        }
    }

    public class TestEndPoint : AsA_Server, IConfigureThisEndpoint
    {
        public void Init()
        {
            Configure.With().StructureMapBuilder(ObjectFactory.Container);
            ObjectFactory.Configure(c => c.AddRegistry<TestSmRegistry>());
            Debug.WriteLine(ObjectFactory.WhatDoIHave());
        }
    }

    public class TestServer : IWantToRunAtStartup
    {
        public TestServer(ITestManager miningServiceManage)
        {
            _miningServiceManage = miningServiceManage;
        }
        private readonly ITestManager _miningServiceManage;
        public void Run()
        {
            _miningServiceManage.Run();
        }
        public void Stop() { }
    }

    public interface ITestManager
    {
        void Run();
    }

    public class TestManager : ITestManager
    {
        public TestManager(IBus bus)
        {
            _bus = bus;
        }
        private readonly IBus _bus;

        public void Run()
        {
            if (_bus == null) Debug.WriteLine("Error no bus");
            // Send messages on bus;
        }
    }
}

  <MsmqTransportConfig InputQueue="test" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"  />

  <UnicastBusConfig>
    <MessageEndpointMappings>
    </MessageEndpointMappings>
  </UnicastBusConfig>

Any ideas?


person SimonB    schedule 23.03.2010    source источник


Ответы (1)


Вы должны указать IWantCustomInitialization в классе конфигурации конечной точки. В противном случае NServiceBus не будет вызывать метод Init (). Вам также необходимо указать, какой сериализатор использовать, поэтому добавьте:

Configure.With () .StructureMapBuilder () .XmlSerializer ();

Надеюсь это поможет!

person Andreas Öhlund    schedule 23.03.2010
comment
NServiceBus зарегистрирует TestServer для вас, чтобы вы могли попытаться удалить For ‹TestServer› (). Используйте ‹TestServer› (); строчку из реестра. Вы используете NServiceBus 2.0? - person Andreas Öhlund; 23.03.2010