EventFlow Versions Save

Async/await first CQRS+ES and DDD framework for .NET

v0.79.4216

4 years ago
  • New: Added .NET Core 3.1 target for the EventFlow and EventFlow.EntityFramework packages
  • Added quoting to the SQL query generator for the column names

v0.78.4205

4 years ago
  • New: Updated LibLog provider to support structured logging with NLog 4.5. Reduced memory allocations for log4net-provider
  • New: Made several methods in AggregateRoot<,> virtual to allow easier customization
  • Fixed: Added quoting to the SQL query generator for the column names
  -- query before the fix
    UPDATE [ReadModel-TestAttributes]
    SET UpdatedTime = @UpdatedTime
    WHERE Id = @Id
  
  -- query after the fix
    UPDATE [ReadModel-TestAttributes]
    SET [UpdatedTime] = @UpdatedTime
    WHERE [Id] = @Id
  • Fixed: Do not log about event upgraders if none is found for an event
  • Fixed: Add default null predicate to AddCommands and AddJobs

v0.77.4077

4 years ago
  • New: The EventFlow.AspNetCore NuGet package now has ASP.NET Core 3 support

v0.76.4014

4 years ago
  • New: Mongo DB read model store Queryable:
    MongoDbReadModelStore readModelStore;
    IQueryable<TReadModel> queryable = readModelStore.AsQueryable();
    
  • New: Moved publish of messages in RabbitMqPublisher to a new virtual method to ease reuse and customization
  • Fixed: MongoDB read models no longer has the new() generic requirement, which aligns read model requirements with the rest of EventFlow

v0.75.3970

4 years ago
  • Fix: When deserializing the JSON value "null" into a struct value like int, the SingleValueObjectConverter threw an exception instead of merely returning null representing an absent SingleValueObject<int> value

v0.74.3948

4 years ago
  • Breaking: Renamed AspNetCoreEventFlowOptions.AddMetadataProviders() to AddDefaultMetadataProviders() and made AddUserClaimsMetadata opt-in in order to prevent policy issues.
  • Fix: Allow explicit implementations of IEmit<> in aggregate roots
  • Fix: Using .AddAspNetCore() with defaults now doesn't throw a DI exception.

v0.73.3933

4 years ago
  • New: Configure JSON serialization:
    EventFlowOptions.New.
      .ConfigureJson(json => json
        .AddSingleValueObjects()
        .AddConverter<SomeConverter>()
      )
    
  • New: ASP.NET Core enhancements:
    • New fluent configuration API for ASP.NET Core components: services.AddEventFlow(o => o.AddAspNetCore(c => {...})); (old syntax AddAspNetCoreMetadataProviders is now deprecated).
    • .RunBootstrapperOnHostStartup() runs bootstrappers together with ASP.NET host startup. Previously, this was done in AddAspNetCoreMetadataProviders and led to some confusion.
    • .UseMvcJsonOptions() adds EventFlow JSON configuration (see below) to ASP.NET Core, so you can accept and return Single Value Objects as plain strings for example.
    • .Add{Whatever}Metadata() configures specific metadata provider.
    • .AddUserClaimsMetadata(params string claimTypes) configures the new claims metadata provider (for auditing or "ChangedBy" in read models).
    • .UseLogging() configures an adapter for Microsoft.Extensions.Logging
    • .UseModelBinding() adds model binding support for Single Value Objects:
          [HttpGet("customers/{id}")]
          public async Task<IActionResult> SingleValue(CustomerId id)
          {
              if (!ModelState.IsValid)
              {
                  return BadRequest(ModelState);
              }
      
  • Fix: ASP.NET Core AddRequestHeadersMetadataProvider doesn't throw when HttpContext is null.
  • Fix: ReadModelRepopulator now correctly populates IAmAsyncReadModelFor

v0.72.3914

4 years ago
  • New: EventFlow.TestHelpers are now released as .NET Standard as well
  • Fix: Upgrade EventStore.Client to v5.0.1 and use it for both .NET Framework and .NET Core
  • Fix: Storing events in MS SQL Server using MsSqlEventPersistence now correctly handles non-ANSI unicode characters in strings.
  • Fix: Source link integration now works correctly

v0.71.3834

5 years ago
  • Breaking: Commands published from AggregateSaga which return false in IExecutionResult.IsSuccess will newly lead to an exception being thrown. For disabling all new changes just set protected property AggregateSaga.ThrowExceptionsOnFailedPublish to false in your AggregateSaga constructor. Also an Exception thrown from any command won't prevent other commands from being executed. All exceptions will be collected and then re-thrown in SagaPublishException (even in case of just one Exception). The exception structure is following:
    • SagaPublishException : AggregateException
      • .InnerExceptions
        • CommandException : Exception
          • .CommandType
          • .SourceId
          • .InnerException # in case of an exception thrown from the command
        • CommandException : Exception
          • .CommandType
          • .SourceId
          • .ExecutionResult # in case of returned false in IExecutionResult.IsSuccess You need to update your ISagaErrorHandler implementation to reflect new exception structure, unless you disable this new feature.
  • Fix: MongoDB read store no longer throws an exception on non-existing read models (#625)

v0.69.3772

5 years ago
  • New: Added configuration option to set the "point of no return" when using cancellation tokens. After this point in processing, cancellation tokens are ignored: options.Configure(c => c.CancellationBoundary = CancellationBoundary.BeforeCommittingEvents)
  • New: Added EventFlowOptions.RunOnStartup<TBootstrap> extension method to register IBootstrap types that should run on application startup.
  • New: Support for async read model updates (IAmAsyncReadModelFor). You can mix and match asynchronous and synchronous updates, as long as you don't subscribe to the same event in both ways.
  • Fix: Added the schema dbo to the eventdatamodel_list_type in script 0002 - Create eventdatamodel_list_type.sql for EventFlow.MsSql.
  • Fix: LoadAllCommittedEvents now correctly handles cases where the GlobalSequenceNumber column contains gaps larger than the page size. This bug lead to incomplete event application when using the ReadModelPopulator (see #564).
  • Fix: IResolver.Resolve<T>() and IResolver.Resolve(Type) now throw an exception for unregistered services when using EventFlow.DependencyInjection.
  • Minor fix: Fixed stack overflow in ValidateRegistrations when decorator components are co-located together with other components that are registed using Add*-methods