Rebus 4.0 - Как указать порядок обработчиков, пробовал с помощью метода "SpecifyOrderOfHandlers", но дает ошибку времени компиляции - PullRequest
1 голос
/ 13 мая 2019

Привет, фанаты Rebus. Мы много лет использовали Rebus 0.84 или 1.0, и теперь переходит на версию 4.0 , и кажется, что она значительно улучшилась в плане реализации и производительности, но столкнулась с некоторыми проблемами, пока выполнение заказов для обработчиков .

Пример в предыдущей версии, мы делали

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 Ответ

1 голос
/ 13 мая 2019

Вы просто сделали вызов на SpecifyOrderOfHandlers немного сложнее - это должно сработать:

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

Если это было неочевидно, то, вероятно, это связано с тем, что SpecifyOrderOfHandlers находится в другом пространстве имен, поэтому если вы добавите

using Rebus.Handlers.Reordering;

где-то в верхней части вашего файла, тогда я уверен, что IntelliSense поможет вам:)

...