public When_an_event_is_mapped_as_a_create_if_does_not_exist()
            {
                Given(() =>
                {
                    var mapBuilder = new EventMapBuilder <ProductCatalogEntry, string, ProjectionContext>();

                    mapBuilder
                    .Map <ProductAddedToCatalogEvent>()
                    .AsCreateIfDoesNotExistOf(e => e.ProductKey)
                    .Using((p, e, ctx) =>
                    {
                        p.Category = e.Category;
                        return(Task.FromResult(0));
                    });

                    mapBuilder.HandleProjectionModificationsAs(async(key, context, projector, options) =>
                    {
                        projection = new ProductCatalogEntry
                        {
                            Id = key,
                        };

                        this.options = options;
                        await projector(projection);
                    });

                    mapBuilder.HandleProjectionDeletionsAs((key, context, options) =>
                    {
                        throw new InvalidOperationException("Deletion should not be called.");
                    });

                    mapBuilder.HandleCustomActionsAs((context, projector) =>
                    {
                        throw new InvalidOperationException("Custom action should not be called.");
                    });

                    map = mapBuilder.Build();
                });

                When(async() =>
                {
                    await map.Handle(
                        new ProductAddedToCatalogEvent
                    {
                        Category   = "Hybrids",
                        ProductKey = "c350E"
                    },
                        new ProjectionContext());
                });
            }
Esempio n. 2
0
        private async Task HandleProjectionModification(TKey key, NHibernateProjectionContext context,
                                                        Func <TProjection, Task> projector, ProjectionModificationOptions options)
        {
            TProjection projection = context.Session.Get <TProjection>(key);

            if (projection == null)
            {
                switch (options.MissingProjectionBehavior)
                {
                case MissingProjectionModificationBehavior.Create:
                {
                    projection = new TProjection {
                        Id = key
                    };
                    await projector(projection).ConfigureAwait(false);

                    context.Session.Save(projection);
                    break;
                }

                case MissingProjectionModificationBehavior.Ignore:
                {
                    break;
                }

                case MissingProjectionModificationBehavior.Throw:
                {
                    throw new ProjectionException(
                              $"Projection {typeof(TProjection)} with key {key} does not exist.");
                }

                default:
                {
                    throw new NotSupportedException(
                              $"Not supported missing projection behavior {options.MissingProjectionBehavior}.");
                }
                }
            }
            else
            {
                switch (options.ExistingProjectionBehavior)
                {
                case ExistingProjectionModificationBehavior.Update:
                {
                    await projector(projection).ConfigureAwait(false);

                    break;
                }

                case ExistingProjectionModificationBehavior.Ignore:
                {
                    break;
                }

                case ExistingProjectionModificationBehavior.Throw:
                {
                    throw new ProjectionException(
                              $"Projection {typeof(TProjection)} with key {key} already exists.");
                }

                default:
                {
                    throw new NotSupportedException(
                              $"Not supported existing projection behavior {options.ExistingProjectionBehavior}.");
                }
                }
            }
        }
        private async Task HandleProjectionModification(string key, RavenProjectionContext context,
                                                        Func <TProjection, Task> projector, ProjectionModificationOptions options)
        {
            string databaseId = BuildDatabaseId(key);
            var    projection = (TProjection)await cache.TryGet(databaseId).ConfigureAwait(false);

            if (projection == null)
            {
                projection = await context.Session.LoadAsync <TProjection>(databaseId).ConfigureAwait(false);

                if (projection != null)
                {
                    cache.Add(projection);
                }
            }

            if (projection == null)
            {
                switch (options.MissingProjectionBehavior)
                {
                case MissingProjectionModificationBehavior.Create:
                {
                    projection = new TProjection {
                        Id = databaseId
                    };
                    await projector(projection).ConfigureAwait(false);

                    cache.Add(projection);
                    await context.Session.StoreAsync(projection).ConfigureAwait(false);

                    break;
                }

                case MissingProjectionModificationBehavior.Ignore:
                {
                    break;
                }

                case MissingProjectionModificationBehavior.Throw:
                {
                    throw new ProjectionException($"Projection with id {databaseId} does not exist.");
                }

                default:
                {
                    throw new NotSupportedException(
                              $"Not supported missing projection behavior {options.MissingProjectionBehavior}.");
                }
                }
            }
            else
            {
                switch (options.ExistingProjectionBehavior)
                {
                case ExistingProjectionModificationBehavior.Update:
                {
                    await projector(projection).ConfigureAwait(false);

                    await context.Session.StoreAsync(projection).ConfigureAwait(false);

                    break;
                }

                case ExistingProjectionModificationBehavior.Ignore:
                {
                    break;
                }

                case ExistingProjectionModificationBehavior.Throw:
                {
                    throw new ProjectionException($"Projection with id {databaseId} already exists.");
                }

                default:
                {
                    throw new NotSupportedException(
                              $"Not supported existing projection behavior {options.ExistingProjectionBehavior}.");
                }
                }
            }
        }