public static void Configure(ProjectionGatewayConfiguration projectionGatewayConfiguration, IPEndPoint httpEndPoint, UserCredentials credentials) { var projectionManager = new ProjectionsManager(new ConsoleLogger(), httpEndPoint, new TimeSpan(1, 0, 0, 0)); var byCategoryProjectionStatus = ((JObject)JsonConvert.DeserializeObject(projectionManager.GetStatusAsync("$by_category", credentials).Result))["status"].ToString(); var streamByCategoryProjectionStatus = ((JObject)JsonConvert.DeserializeObject(projectionManager.GetStatusAsync("$stream_by_category", credentials).Result))["status"].ToString(); if (byCategoryProjectionStatus == "Stopped") { projectionManager.EnableAsync("$by_category", credentials).Wait(); } if (streamByCategoryProjectionStatus == "Stopped") { projectionManager.EnableAsync("$stream_by_category", credentials).Wait(); } const string projectionPattern = @"fromCategory('{0}') .foreachStream() .whenAny(function(state, event){{ linkTo('{1}', event); }})"; foreach (var aggregateRootName in projectionGatewayConfiguration.Subscriptions.Keys) { projectionManager.CreateContinuousAsync( string.Format("{0}Projection", aggregateRootName), string.Format(projectionPattern, aggregateRootName, aggregateRootName + "View"), credentials).Wait(); } }
//TODO: Need restore point configuration private static void Start(ProjectionGatewayConfiguration projectionGatewayConfiguration, IEventStoreConnection eventStoreConnection) { projectionGatewayConfiguration.Locator.Register(() => eventStoreConnection); eventStoreConnection.ConnectAsync().Wait(); foreach (var subscription in projectionGatewayConfiguration.Subscriptions) { var eventHandlers = subscription.Value; eventStoreConnection.SubscribeToStreamFrom( stream: subscription.Key + "View", lastCheckpoint: StreamCheckpoint.StreamStart, resolveLinkTos: true, eventAppeared: (upSubscription, @event) => { var eventType = Type.GetType(@event.Event.EventType); var deserializedEvent = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(@event.Event.Data), eventType); eventHandlers .Single(x => x.EventType == eventType) .EventHandler(deserializedEvent); }); } }