将nServiceBus与StructureMap集成的问题

时间:2010-03-23 01:38:12

标签: structuremap nservicebus

我正在尝试将StructureMap与nServiceBus一起使用。

项目:

  • 使用GenericHost端点发送命令消息
  • 使用StructMapBuilder配置nServiceBus。
  • 使用简单的StructureMap注册表配置
  • 使用支持IWantToRunAtStartup的启动类TestServer
  • TestServer类对testManager类具有ctor依赖性
  • TestManager类对IBus
  • 具有ctor依赖性

ObjectFactory.WhatDoIHave()显示StructureMap知道如何构造类。

运行时出现堆积错误。 nServiceBus似乎覆盖了配置?

请注意,当我向我的事件处理程序添加IBus ctor依赖性而没有任何其他配置时,一切都显示正常。

错误:

  

启动端点时出现异常,已记录错误。原因:错误创建名为“nSeviceBusStructureMapTest.TestServer”对象:不合格依赖通过与式[nSeviceBusStructureMapTest.ITestManager]的索引0构造器参数表示:式[nSeviceBusStructureMapTest.ITestManager]的没有唯一对象被定义:类型的不合格依赖[nSeviceBusStructureMapTest。 ITestManager]:期望至少有一个匹配对象来连接对象[nSeviceBusStructureMapTest.TestServer]的构造函数上的[miningServiceManage]参数

来源:

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>

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您必须在端点配置类上指定IWantCustomInitialization。否则NServiceBus将不会调用Init()方法。您还需要指定要使用的序列化程序,因此请添加:

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

希望这有帮助!