Автокорреляция в саге для запроса / ответа

Я хотел спросить, правильно ли я понимаю, что благодаря этому https://github.com/rebus-org/Rebus/issues/105 когда я делаю сагу для запроса / ответа, я могу оставить ConfigureHowToFindSaga пусто?

Если это правда, было бы неплохо упомянуть об этом на вики-странице, а также о необходимости регистрации саги в адаптере:)

Код ниже, кажется, работает, не могли бы вы посмотреть, если это нормально?

namespace ConsoleApplication1
{
    class Program
    {
        static IBus bus;
        static void Main(string[] args)
        {
            var adapter = new BuiltinContainerAdapter();

            adapter.Register<SampleSaga>(() => new SampleSaga(bus));

            bus = Configure.With(adapter)
                             .Logging(l => l.ColoredConsole())
                             .Transport(t => t.UseMsmq("enpoint1", "endpoint1_errors"))
                             .MessageOwnership(x => x.FromRebusConfigurationSection())
                             .Sagas(x => x.StoreInMemory())
                             .CreateBus()
                             .Start();

            bus.SendLocal(new SampleMessage() { Test = "Hi there" });
        }
    }

    class SampleSaga : Saga<MessageHolder<SampleMessage>>,
                                           IAmInitiatedBy<SampleMessage>,
                                           IHandleMessages<Response>
    {
        IBus bus;

        public SampleSaga(IBus bus)
        {
            this.bus = bus;
        }

        public override void ConfigureHowToFindSaga()
        {
        }

        public void Handle(SampleMessage message)
        {
            Data.Message = message;
            bus.Send(new Request());
        }

        public void Handle(Response message)
        {
            Console.Write(string.Format("Response arrived. Holded message: {0}", Data.Message.Test));
            MarkAsComplete();
        }
    }

    class MessageHolder<T> : ISagaData
    {
        public Guid Id { get; set; }
        public int Revision { get; set; }
        public T Message { get; set; }
    }

    class SampleMessage
    {
        public string Test { get; set; }
    }
}


namespace ConsoleApplication2
{
    class Program
    {
        static IBus bus;
        static void Main(string[] args)
        {
            var adapter = new BuiltinContainerAdapter();

            adapter.Handle<Request>(x => bus.Reply(new Response()));

            bus = Configure.With(adapter)
                             .Logging(l => l.ColoredConsole())
                             .Transport(t => t.UseMsmq("endpoint2", "endpoint2_errors"))
                             .MessageOwnership(x => x.FromRebusConfigurationSection())
                             .CreateBus()
                             .Start();
        }
    }

    public class Request
    {

    }

    public class Response
    {

    }
}

1 ответ

Решение

Да, это правда, и я согласен с вами, что это должно быть где-то задокументировано:)

Однако эта функция существует уже довольно давно, и я не очень часто ее использовал - в основном потому, что я чувствую, что это чересчур черный ящик, чтобы его можно было сразу понять, что, по моему мнению, должно происходить большую часть времени в коде.,

Мои чувства могут быть вызваны тем, что я слишком мало использовал эту функцию, поэтому в будущем у меня может появиться другое чувство:)

Ваш код выглядит хорошо, и я думаю, что он должен работать отлично. Теперь я знаю, что это простой POC, но, пожалуйста, не забывайте "размещать" свой контейнерный адаптер где-нибудь на время жизни приложения, и, пожалуйста, не забудьте утилизировать его, когда приложение закрывается.

Другие вопросы по тегам