1

我想问一下,当我为 Request/Reply 做 saga 时,我是否理解正确,感谢这个https://github.com/rebus-org/Rebus/issues/105我可以ConfigureHowToFindSaga留空?

如果是真的,最好在 Wiki 页面中提及它,以及在适配器中注册 saga 的需要 :)

下面的代码似乎可以工作,请您看看是否可以?

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
    {

    }
}
4

1 回答 1

1

是的,这是真的,我同意你的观点,应该记录在某处:)

不过,该功能已经存在了相当长的一段时间,我并没有太多使用它——主要是因为我觉得它有点太黑了,无法立即理解,我认为大部分时间都应该是代码.

不过,我的感觉可能是由于我使用该功能太少造成的,所以我将来可能会有另一种感觉:)

您的代码看起来不错,我认为它应该可以完美运行。现在,我知道这只是一个简单的 POC,但请记住在应用程序生命周期内将您的容器适配器“托管”在某个地方,并且请记住在应用程序关闭时处理它。

于 2014-12-03T19:34:51.663 回答