2

我正在尝试将 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]:预计至少有 1 个匹配对象连接到对象 [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>

有任何想法吗?

4

1 回答 1

4

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

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

希望这可以帮助!

于 2010-03-23T08:34:48.900 回答