我想问一下,我是否正确理解,感谢这个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
{
}
}
答案 0 :(得分:1)
是的,这是真的,我同意你应该在某处记录:)
这个功能已经存在很长一段时间了,但我还没有那么多使用它 - 主要是因为我觉得它有点太黑了可以立即理解,我认为代码应该是大部分时间。
我的感受可能是因为我使用这个功能太少了,所以我可能会在将来的某个时候感受到另一种感觉:)
您的代码看起来很好,我认为它应该可以正常工作。现在,我知道它只是一个简单的POC,但请记住&#34;主持人&#34;您的容器适配器在应用程序生命周期内的某个地方,请记得在应用程序关闭时将其丢弃。