Я пытаюсь использовать 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.ITestMedTeviceTeviceSystem_anager].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>
Есть идеи?