public IToposProducer Create() { ToposConfigurerHelpers.RegisterCommonServices(_injectionist); _injectionist.Register <IToposProducer>(c => { var messageSerializer = c.Get <IMessageSerializer>(); var producerImplementation = c.Get <IProducerImplementation>(errorMessage: "Failing to get the producer implementation can be caused by a missing registration of IProducerImplementation"); var loggerFactory = c.Get <ILoggerFactory>(); var defaultToposProducer = new DefaultToposProducer( messageSerializer, producerImplementation, loggerFactory ); defaultToposProducer.Disposing += () => { foreach (var instance in c.TrackedInstances.OfType <IDisposable>().Reverse()) { instance.Dispose(); } }; return(defaultToposProducer); }); var resolutionResult = _injectionist.Get <IToposProducer>(); foreach (var initializable in resolutionResult.TrackedInstances.OfType <IInitializable>()) { initializable.Initialize(); } return(resolutionResult.Instance); }
public IToposConsumer Create() { ToposConfigurerHelpers.RegisterCommonServices(_injectionist); _injectionist.PossiblyRegisterDefault(c => new ConsumerContext()); _injectionist.Decorate(c => { var context = c.Get <ConsumerContext>(); var customizers = _options.Get(ConsumerContext.ConsumerContextInitializersKey, new List <Action <ConsumerContext> >()); foreach (var customizer in customizers) { customizer(context); } return(context); }); _injectionist.PossiblyRegisterDefault <IConsumerDispatcher>(c => { var loggerFactory = c.Get <ILoggerFactory>(); var messageSerializer = c.Get <IMessageSerializer>(); var handlers = c.Get <Handlers>(errorMessage: @"Failing to get the handlers is a sign that the consumer has not had any handlers configured. Please remember to configure at least one handler by invoking the .Handle(..) configurer like this: Configure.Consumer(...) .(...) .Handle(async (messages, context, cancellationToken) => { // handle messages }) .Start() "); var positionManager = c.Get <IPositionManager>(errorMessage: @"The consumer dispatcher needs access to a positions manager, so it can store a 'low water mark' position for each topic/partition. It can be configured by invoking the .Positions(..) configurer like this: Configure.Consumer(...) .(...) .Positions(p => p.StoreIn(...)) .Start() "); var consumerContext = c.Get <ConsumerContext>(); return(new DefaultConsumerDispatcher(loggerFactory, messageSerializer, handlers, positionManager, consumerContext)); }); _injectionist.Register <IToposConsumer>(c => { var toposConsumerImplementation = c.Get <IConsumerImplementation>(); var defaultToposConsumer = new DefaultToposConsumer(toposConsumerImplementation); defaultToposConsumer.Disposing += () => { foreach (var instance in c.TrackedInstances.OfType <IDisposable>().Reverse()) { instance.Dispose(); } }; return(defaultToposConsumer); }); var resolutionResult = _injectionist.Get <IToposConsumer>(); foreach (var initializable in resolutionResult.TrackedInstances.OfType <IInitializable>()) { initializable.Initialize(); } return(resolutionResult.Instance); }