public override void Build() { var builder = this as ISettingsBuilder; var processorSettings = this as ISubscrptionMiddlewareSettings; Func <SubscriptionMiddleware> messageHandlerProcessorFactory = () => { var handlerFactory = new DefaultHandlerFactory(processorSettings.HandlerFactory); var repository = builder.Container.Resolve <IAggregateRepository>(builder.Name); var publisher = builder.Container.Resolve <IPublisher <IEvent> >(builder.Name); //create extension methis UseApplicationMiddleware instead of instance here. var applicationServiceMiddleware = new ApplicationServiceMiddleware(handlerFactory, repository, publisher); var middleware = processorSettings.HandleMiddleware(applicationServiceMiddleware); var subscriptionMiddleware = new SubscriptionMiddleware(); foreach (var reg in (this as ISubscrptionMiddlewareSettings).HandlerRegistrations) { if (typeof(IAggregateRootApplicationService).IsAssignableFrom(reg)) { subscriptionMiddleware.Subscribe(new HandleSubscriber <IAggregateRootApplicationService, ICommandHandler <ICommand> >(reg, middleware)); } } return(subscriptionMiddleware); }; builder.Container.RegisterSingleton <SubscriptionMiddleware>(() => messageHandlerProcessorFactory(), builder.Name); }
public override void Build() { var hasher = new ProjectionHasher(); var builder = this as ISettingsBuilder; var processorSettings = this as ISubscrptionMiddlewareSettings; Func <SubscriptionMiddleware> messageHandlerProcessorFactory = () => { var handlerFactory = new DefaultHandlerFactory(processorSettings.HandlerFactory); var clusterServiceMiddleware = new SystemMiddleware(handlerFactory); var middleware = processorSettings.HandleMiddleware(clusterServiceMiddleware); var subscriptionMiddleware = new SubscriptionMiddleware(); var clusterSettings = builder.Container.Resolve <IClusterSettings>(); string nodeId = $"{clusterSettings.CurrentNodeName}@{clusterSettings.ClusterName}"; foreach (var reg in (this as ISubscrptionMiddlewareSettings).HandlerRegistrations) { string subscriberId = reg.FullName + "." + nodeId; if (typeof(ISystemProjection).IsAssignableFrom(reg) && reg.IsClass) { subscriptionMiddleware.Subscribe(new SystemProjectionSubscriber(reg, middleware, subscriberId)); var transport = builder.Container.Resolve <ITransport>(builder.Name); var serializer = builder.Container.Resolve <ISerializer>(null); var publisher = transport.GetPublisher <ICommand>(serializer); var projManagerId = new ProjectionVersionManagerId(reg.GetContractId()); var command = new RegisterProjection(projManagerId, hasher.CalculateHash(reg).ToString()); publisher.Publish(command); } } return(subscriptionMiddleware); }; builder.Container.RegisterSingleton <SubscriptionMiddleware>(() => messageHandlerProcessorFactory(), builder.Name); }
public override void Build() { var builder = this as ISettingsBuilder; var processorSettings = this as ISubscrptionMiddlewareSettings; Func <SubscriptionMiddleware> messageHandlerProcessorFactory = () => { var handlerFactory = new DefaultHandlerFactory(processorSettings.HandlerFactory); var publisher = builder.Container.Resolve <IPublisher <IEvent> >(builder.Name); var repository = builder.Container.Resolve <IAggregateRepository>(builder.Name); var systemServiceMiddleware = new ApplicationServiceMiddleware(handlerFactory, repository, publisher); var middleware = processorSettings.HandleMiddleware(systemServiceMiddleware); var subscriptionMiddleware = new SubscriptionMiddleware(); foreach (var reg in (this as ISubscrptionMiddlewareSettings).HandlerRegistrations) { if (typeof(ISystemService).IsAssignableFrom(reg) && reg.IsClass) { subscriptionMiddleware.Subscribe(new SystemServiceSubscriber(reg, middleware)); } } return(subscriptionMiddleware); }; builder.Container.RegisterSingleton <SubscriptionMiddleware>(() => messageHandlerProcessorFactory(), builder.Name); }
public override void Build() { var hasher = new ProjectionHasher(); var builder = this as ISettingsBuilder; var processorSettings = this as ISubscrptionMiddlewareSettings; Func <SubscriptionMiddleware> messageHandlerProcessorFactory = () => { var handlerFactory = new DefaultHandlerFactory(processorSettings.HandlerFactory); // May be we want to have separate serializer + transport per type?!?!? var transport = builder.Container.Resolve <ITransport>(builder.Name); var serializer = builder.Container.Resolve <ISerializer>(null); var publisher = transport.GetPublisher <ICommand>(serializer); var projectionsMiddleware = new ProjectionsMiddleware(handlerFactory); var middleware = processorSettings.HandleMiddleware(projectionsMiddleware); var subscriptionMiddleware = new SubscriptionMiddleware(); var iProjection = typeof(IProjection); foreach (var handler in processorSettings.HandlerRegistrations) { if (iProjection.IsAssignableFrom(handler)) { subscriptionMiddleware.Subscribe(new HandlerSubscriber <IProjection, IEventHandler <IEvent> >(handler, middleware)); var projManagerId = new ProjectionVersionManagerId(handler.GetContractId()); var command = new RegisterProjection(projManagerId, hasher.CalculateHash(handler).ToString()); publisher.Publish(command); } } var indexSubscriber = builder.Container.Resolve <EventTypeIndexForProjections>(); subscriptionMiddleware.Subscribe(indexSubscriber); return(subscriptionMiddleware); }; builder.Container.RegisterSingleton <SubscriptionMiddleware>(() => messageHandlerProcessorFactory(), builder.Name); }
public override void Build() { var builder = this as ISettingsBuilder; var processorSettings = this as ISubscrptionMiddlewareSettings; Func <SubscriptionMiddleware> messageHandlerProcessorFactory = () => { var handlerFactory = new DefaultHandlerFactory(processorSettings.HandlerFactory); var publisher = builder.Container.Resolve <IPublisher <ICommand> >(builder.Name); var portsMiddleware = new PortsMiddleware(handlerFactory, publisher); var middleware = processorSettings.HandleMiddleware(portsMiddleware); var subscriptionMiddleware = new SubscriptionMiddleware(); foreach (var reg in (this as ISubscrptionMiddlewareSettings).HandlerRegistrations) { if (typeof(IPort).IsAssignableFrom(reg)) { subscriptionMiddleware.Subscribe(new HandleSubscriber <IPort, IEventHandler <IEvent> >(reg, middleware)); } } return(subscriptionMiddleware); }; builder.Container.RegisterSingleton <SubscriptionMiddleware>(() => messageHandlerProcessorFactory(), builder.Name); }