コード例 #1
0
        public AggregateModule(IAggregateSchema <TAggregate> schema,
                               ICommandDispatcher commandDispatcher,
                               ILogger logger,
                               IServiceProvider serviceProvider)
        {
            foreach (var i in schema.Commands)
            {
                //TODO: should cache ctor for performance
                var binderType = typeof(PostBinder <>).MakeGenericType(typeof(TAggregate), i.Type);
                var binder     = Ctor <IBinder> .Create(binderType);

                binder.BindCommand(schema, this, commandDispatcher, logger);
            }

            Get(schema.Category + "/{id:Guid}", async(request, response) =>
            {
                var stream = serviceProvider.GetService <IAggregateEventStream <TAggregate> >();
                Guid id    = request.RouteValues.As <Guid>("id");
                var events = new List <IEvent>();
                await foreach (var e in stream.Get(id))
                {
                    events.Add(e);
                }
                await response.AsJson(events.ToArray());
            });
        }
コード例 #2
0
        private static AggregateEventStream <HotelAggregate> GetStream(IEventStoreFacade connection,
                                                                       IAggregateSchema <HotelAggregate> schema)
        {
            AggregateEventStream <HotelAggregate> stream = new AggregateEventStream <HotelAggregate>(connection, new EventConverter(),
                                                                                                     new EventDataFactory(), new EventMetadataFactory <HotelAggregate>(), schema, Logger.None);

            return(stream);
        }
コード例 #3
0
            public EventEntry(Type eventType, IAggregateSchema schema)
            {
                string text = $"{schema.Category.Humanize()} {eventType.Name.Humanize()}";

                Description     = new Statement(text);
                EventType       = eventType;
                AggregateSchema = schema;
            }
コード例 #4
0
        private Guid GetAggregateId(IAggregateSchema aggregateType)
        {
            if (!_defaultCatalogIdentifiers.TryGetValue(aggregateType.Category, out Guid aggregateId))
            {
                aggregateId = Guid.NewGuid();
                _defaultCatalogIdentifiers.Add(aggregateType.Category, aggregateId);
            }

            return(aggregateId);
        }
コード例 #5
0
 public AggregateEventStream(IEventStoreFacade connection,
                             IEventConverter eventConverter,
                             IEventDataFactory eventDataFactory,
                             IEventMetadataFactory <TAggregate> metadataFactory,
                             IAggregateSchema <TAggregate> aggregateSchema, Serilog.ILogger logger)
 {
     _connection       = connection;
     _eventConverter   = eventConverter;
     _eventDataFactory = eventDataFactory;
     _metadataFactory  = metadataFactory;
     _aggregateSchema  = aggregateSchema;
     _logger           = logger;
 }
コード例 #6
0
            public void BindCommand(IAggregateSchema schema,
                                    AggregateModule <TAggregate> module,
                                    ICommandDispatcher commandDispatcher, ILogger logger)
            {
                var actionName = ServiceConventions.GetActionNameFromCommand(typeof(TCommand));

                module.Post($"{schema.Category}/{actionName}/{{id:Guid}}",
                            async(request, response) =>
                {
                    logger.Information("Handling {commandName}", typeof(TCommand).Name);
                    var stream        = request.BodyReader.AsStream();
                    var streamReader  = new StreamReader(stream);
                    var stringContent = await streamReader.ReadToEndAsync();
                    var cmd           = JsonConvert.DeserializeObject <TCommand>(stringContent);

                    Guid id = request.RouteValues.As <Guid>("id");

                    await commandDispatcher.Dispatch(id, cmd);
                    await response.AsJson(cmd);
                });
            }
コード例 #7
0
 public AggregateSchema(IAggregateSchema schema)
 {
     _schema = schema;
 }