在代码中而不是在app.config中配置Rebus路由(端点)

时间:2014-09-16 07:54:57

标签: rebus

我想在OneWayClientMode中使用#rebus,同时在代码中配置端点地址,而不是通过app.config。

这可能吗?我在流畅的配置中找不到任何痕迹。

2 个答案:

答案 0 :(得分:2)

基本上,您有两种选择:1)在发送消息时明确路由消息,2)使用“IDetermineMessageOwnership”实现您自己的路由逻辑

第一个选项非常简单,非常明确 - 只要发送邮件,您就可以转到bus.Advanced.Routing.Send(destination, message)。您当然应该注意不要对目的地进行太多次硬编码,这可能会导致以后出现问题:)

第二个选项也很简单,但稍微隐含一点 - 你可以实现IDetermineMessageOwnership接口,这基本上是一种将消息类型映射到端点的方法,然后让Rebus像这样使用它:

Configure.With(...)
    .(...)
    .MessageOwnership(m => m.Use(myImplementation))
    .(...)

除非我只打算做一两个bus.Send,否则我会选择后一个选项:)快乐路由!

答案 1 :(得分:2)

我想提供选项2的更明确的示例,因为我必须搜索示例以了解如何键入" myImplementation",这非常简单。假设您希望sWorkerId标识的队列接收所有消息,这就是您要做的:

    Configure.With(...
                 .MessageOwnership(o => o.Use(new RebusConfig(sWorkerId))) 
                 .CreateBus()
                 .Start(RebusConfig.NumberOfWorkers)

RebusConfig将IDetermineMessageOwnership实现为:

public class RebusConfig : IDetermineMessageOwnership
{
  private string m_sWorkerRoleEndpoint;

  public RebusConfig(string sWorkerRoleEndpointId)
  {
    m_sWorkerRoleEndpoint = sWorkerRoleEndpointId;
  }

  public string GetEndpointFor(Type messageType)
  {
    return m_sWorkerRoleEndpoint;
  }
}

希望这会有所帮助......