Rebus 4.0-如何指定处理程序的顺序,尝试使用“ SpecifyOrderOfHandlers”方法,但会给出编译时错误

时间:2019-05-13 10:26:39

标签: rebus

Hellooo Rebus粉丝,我们使用Rebus 0.84 aka 1.0已有很多年了,现在已经升级到4.0版本,在实现和性能方面似乎有很多改进,但是在< strong>为处理程序执行命令。

以前版本中的示例,我们曾经做过

public class RebusInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        Configure.With(new WindsorContainerAdapter(container))
      .Logging(l => l.Log4Net())
      .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
      .SpecifyOrderOfHandlers(t => t.First<AuthenticationHandler>())
      .Serialization(x => x.UseJsonSerializer())
      .MessageOwnership(m => m.FromRebusConfigurationSection())
      .Sagas(m => m.StoreInNDb())
      .Subscriptions(m => m.StoreInNDb())
      .Timeouts(m => m.StoreInMemory())
      .Events(e =>
      {
          e.MessageSent += (advancedbus, destination, message) =>
          {
              var timeToBeReceived = ConfigurationManager.AppSettings["TimeToBeReceived"];
              if (string.IsNullOrEmpty(timeToBeReceived))
                  timeToBeReceived = "00:00:30";
              if (timeToBeReceived != "-1")
              {
                  advancedbus.AttachHeader(message, Headers.TimeToBeReceived, timeToBeReceived);
                  advancedbus.AttachHeader(message, Headers.Express, "rebus-express");
              }
          };
      })
      .CreateBus()
      .Start();
    }
}

现在,如果我要在rebus 4.0上实现相同的功能,则在尝试“ SpecifyOrderOfHandlers”时会给出编译时错误,即它不接受任何参数,那么我们如何实现处理程序的排序,以下是rebus 4.0的实现

using Rebus.Config;
using Rebus.Persistence.InMem;
using Rebus.Handlers;
using Rebus.Messages;

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        Configure.With(new CastleWindsorContainerAdapter(container))
          .Options(o =>
          {
              o.SpecifyOrderOfHandlers(o => o.First<AuthenticationHandler>());
          })
          .Logging(l => l.Log4Net())
          .Transport(t => t.UseMsmq(ConfigurationManager.AppSettings["InputQueue"]))
          .Routing(r => r.TypeBasedRoutingFromAppConfig())
          .Sagas(m => m.StoreInNDb())
          .Subscriptions(m => m.StoreInNDb())
          .Timeouts(m => m.StoreInMemory())
          .Events(e =>
          {
              e.BeforeMessageSent += (bus, headers, message, context) =>
              {
                  var timeToBeReceived = ConfigurationManager.AppSettings["TimeToBeReceived"];
                  if (string.IsNullOrEmpty(timeToBeReceived))
                      timeToBeReceived = "00:00:30";
                  if (timeToBeReceived != "-1")
                  {
                      headers.Add(Headers.TimeToBeReceived, timeToBeReceived);
                      headers.Add(Headers.Express, "rebus-express");
                  }
              };
          })
          .Start();
    }

请提出如何使用Rebus 4.0实现处理程序订购的方法,并告诉我上述实现Rebus 4.0的方法是否正确或需要改进。

1 个答案:

答案 0 :(得分:1)

您只是简单地拨打了SpecifyOrderOfHandlers的电话,有点太复杂了–这应该可以解决问题:

Configure.With(activator)
    (...)
    .Options(o =>
    {
        o.SpecifyOrderOfHandlers()
            .First<AuthenticationHandler>();
    })
    .(...)
    .Start();

如果不是很明显,可能是因为SpecifyOrderOfHandlers在另一个名称空间中,所以如果添加

using Rebus.Handlers.Reordering;

在文件顶部的某个位置,那么我敢打赌,IntelliSense会指导您:)