Автокорреляция в саге для запроса / ответа
Я хотел спросить, правильно ли я понимаю, что благодаря этому 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, но, пожалуйста, не забывайте "размещать" свой контейнерный адаптер где-нибудь на время жизни приложения, и, пожалуйста, не забудьте утилизировать его, когда приложение закрывается.