saga中的自相关请求/回复

时间:2014-12-03 10:25:57

标签: rebus 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
    {

    }
}

1 个答案:

答案 0 :(得分:1)

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

这个功能已经存在很长一段时间了,但我还没有那么多使用它 - 主要是因为我觉得它有点太黑了可以立即理解,我认为代码应该是大部分时间。

我的感受可能是因为我使用这个功能太少了,所以我可能会在将来的某个时候感受到另一种感觉:)

您的代码看起来很好,我认为它应该可以正常工作。现在,我知道它只是一个简单的POC,但请记住&#34;主持人&#34;您的容器适配器在应用程序生命周期内的某个地方,请记得在应用程序关闭时将其丢弃。