Also Chris,
I did get everything running for the Starbucks Barista service using the Automatonymous library. All I'm really looking for is a bit more of an elegant way to configure the AutomatonymousStateMachineSagaRepository class in the DI container, assuming I need it.
So my Windsor container setup is like this:
var container = new WindsorContainer();
container.Register(
Component.For(typeof(ISessionFactory))
.UsingFactoryMethod(() => CreateASMSessionFactory())
.LifeStyle.Singleton,
Component.For(typeof(ISagaRepository<>))
.ImplementedBy(typeof(NHibernateSagaRepository<>))
.LifeStyle.Singleton,
Component.For<AutomatonymousStateMachineSagaRepository<DrinkPreparationSagaInstance>>().UsingFactoryMethod(() =>
{
var _repository = container.Resolve<ISagaRepository<DrinkPreparationSagaInstance>>();
return new AutomatonymousStateMachineSagaRepository<DrinkPreparationSagaInstance>(_repository,
x => false, Enumerable.Empty<StateMachineEventCorrelation<DrinkPreparationSagaInstance>>());
}).LifeStyle.Singleton,
Component.For<DrinkPreparationSagaASM>(),
Component.For<BaristaService>()
.LifeStyle.Singleton,
Component.For<IServiceBus>().UsingFactoryMethod(() =>
{
return ServiceBusFactory.New(sbc =>
{
sbc.UseRabbitMq();
sbc.ReceiveFrom("rabbitmq://localhost/starbucks_barista");
sbc.UseControlBus();
sbc.Subscribe(subs => { subs.LoadFrom(container); });
sbc.Subscribe(subs =>
{
var _machine = container.Resolve<DrinkPreparationSagaASM>();
AutomatonymousStateUserType<DrinkPreparationSagaASM>.SaveAsString(_machine);
var _repository = container.Resolve<AutomatonymousStateMachineSagaRepository<DrinkPreparationSagaInstance>>();
subs.StateMachineSaga(_machine, _repository, x =>
{
x.RemoveWhenFinalized();
});
});
});
}).LifeStyle.Singleton);