protected virtual UnsubscribeAction Connect <TComponent, TMessage>(ISubscriberContext context) where TMessage : class where TComponent : class, Observes <TMessage, TComponent>, ISaga { MessageRouterConfigurator routerConfigurator = MessageRouterConfigurator.For(context.Pipeline); var router = routerConfigurator.FindOrCreate <TMessage>(); var instance = (Observes <TMessage, TComponent>) FastActivator <TComponent> .Create(Guid.Empty); Expression <Func <TComponent, TMessage, bool> > selector = instance.GetBindExpression(); var repository = context.Builder.GetInstance <ISagaRepository <TComponent> >(); var policy = new ExistingSagaPolicy <TComponent, TMessage>(x => false); var sink = new PropertySagaMessageSink <TComponent, TMessage>(context, context.Data as IServiceBus, repository, policy, selector); if (sink == null) { throw new ConfigurationException("Could not build the message sink for " + typeof(TComponent).FullName); } var result = router.Connect(sink); UnsubscribeAction remove = context.SubscribedTo <TMessage>(); return(() => result() && (router.SinkCount == 0) && remove()); }
protected override ISagaMessageSink <TSaga, TMessage> CreateSink(ISagaRepository <TSaga> repository, ISagaPolicy <TSaga, TMessage> policy) { var sink = new PropertySagaMessageSink <TSaga, TMessage>(repository, policy, _selector); if (sink == null) { throw new ConfigurationException("Could not build the message sink for " + typeof(TSaga).FullName); } return(sink); }
public bool Inspect <TComponent, TMessage>(PropertySagaMessageSink <TComponent, TMessage> sink) where TMessage : class where TComponent : class, Consumes <TMessage> .All, ISaga { string policyDescription = GetPolicy(sink.Policy); string expression = sink.Selector.ToString(); Append(string.Format("{0} Saga {1} ({2}): {3}", policyDescription, GetComponentName <TComponent>(), GetMessageName <TMessage>(), expression)); return(true); }
public bool Inspect <TComponent, TMessage>(PropertySagaMessageSink <TComponent, TMessage> sink) where TMessage : class where TComponent : class, Consumes <TMessage> .All, ISaga { Type componentType = typeof(TComponent); string componentName = componentType.IsGenericType ? componentType.GetGenericTypeDefinition().FullName : componentType.FullName; string policyDescription = GetPolicy(sink.Policy); string expression = sink.Selector.ToString(); Append(string.Format("{0} Saga {1} ({2}): {3}", policyDescription, componentName, typeof(TMessage).Name, expression)); return(true); }