Skip to content
This repository was archived by the owner on Mar 19, 2025. It is now read-only.

Releases

11.0.0: NET 8 & 9

Choose a tag to compare

@MooVC MooVC released this 07 Dec 23:03
e1ec244

Enhancements

  • Added support for .NET 8 and .NET 9.
  • Removed support for .NET 6 and .NET 7.

Full Changelog: v10.0.0...v11.0.0

10.0.0: Enhanced Diagnostics & Guard Handling

Choose a tag to compare

@MooVC MooVC released this 01 Dec 12:02
83b295a

This release focuses on adding a greater degree of flexibility into the framework, following feedback gained from years of successful implementations. Features that have resulted in unneccessary overhead have been removed, with additional features added to support automation and reduce the overall code footprint required.

Enhancements

  • Added a new Aborted event to Architecture.Ddd.Services.IRepository (Breaking Change).
  • Added a new Aborted event to Architecture.Ddd.Services.Reconciliation.IEventReconciler (Breaking Change).
  • Added a new constructor variant to Architecture.Cqrs.Services.PaginatedResult<TQuery, T>, enable initialization via an instance of Linq.PagedResult<TQuery, T>.
  • Added Architecture.Ddd.Collections.EnumerableExtensions.ToUnversioned extension to convert a collection of references into their unversioned equivilent.
  • Added Architecture.Ddd.Collections.EnumerableExtensions.ToUnversioned extension to convert a collection of typed references into their unversioned equivilent.
  • Added Architecture.Ddd.MessageExtensions.TryIdentify extension to determine the contextual refernece with a message (if applicable).
  • Added Architecture.Ddd.Reference to support situations where a reference may be required to be within a subset of types. The classes are abstract to ensure the implementation provides meaningful accessors, rather than the internal generic accessors like 'first/second etc'.
  • Added Architecture.Ddd.ReferenceExtensions.Is extension to determine if an instance of Ddd.Reference is of a specific aggregate type.
  • Added Ddd.Threading.AggregateCoordinator to provide a more concise implementation to coordination in the context of a specific aggregate.
  • Added Ddd.Threading.IAggregateCoordinator to provide a more concise approach to coordinating in the context of a specific aggregate.
  • Changed Architecture.Ddd.Collections.EnumerableExtensions.ToReferences to accept an optional parameter named unversioned with a default value of false that will determine the versioned state of the references generated (Breaking Change).
  • Changed Architecture.Ddd.DomainEvent so that the order of construction parameters is now alphabetic (Breaking Change).
  • Changed Architecture.Ddd.DomainException so that the order of construction parameters is now alphabetic (Breaking Change).
  • Changed Architecture.Ddd.Ensure.ReferenceIsNotEmpty (now IsNotEmpty) so that a default value can now be passed and used if the argument fails to pass the assertion.
  • Changed Architecture.Ddd.Ensure.ReferenceIsNotEmpty (now IsNotEmpty) so that the message is now a named optional parameter (Breaking Change).
  • Changed Architecture.Ddd.Ensure.ReferenceIsNotEmpty (now IsNotEmpty) so that the name of the argument is now optional (Breaking Change).
  • Changed Architecture.Ddd.Ensure.ReferenceIsOfType (now IsOfType) so that a default value can now be passed and used if the argument fails to pass the assertion.
  • Changed Architecture.Ddd.Ensure.ReferenceIsOfType (now IsOfType) so that the message is now a named optional parameter (Breaking Change).
  • Changed Architecture.Ddd.Ensure.ReferenceIsOfType (now IsOfType) so that the name of the argument is now optional (Breaking Change).
  • Changed Architecture.Ddd.ReferenceExtensions.IsOfType to allow the caller to request that the reference returned be unversioned.
  • Changed Architecture.Ddd.ReferenceExtensions.ToTyped to allow the caller to request that the typed reference returned be unversioned.
  • Changed Architecture.Ddd.ReferenceExtensions.ToUnversioned to allow for a null reference.
  • Changed Architecture.Ddd.ReferenceExtensions.ToUnversioned to allow for a null reference.
  • Changed Architecture.Ddd.Services.AggregateNotFoundException so that the order of construction parameters is now alphabetic (Breaking Change).
  • Changed Architecture.Ddd.Services.AggregateVersionNotFoundException so that the order of construction parameters is now alphabetic (Breaking Change).
  • Changed Architecture.Ddd.Services.AtomicUnit so that the order of construction parameters is now alphabetic (Breaking Change).
  • Changed Architecture.Ddd.Services.Bus so that it now accepts an optional IDiagnosticsProxy.
  • Changed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand> so that it now requires an instance of Ddd.Threading.IAggregateCoordinator as a parameter on construction (Breaking Change).
  • Changed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand> so that it is now possible to override the generate behavior via GenerateAsync.
  • Changed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand> so that it is now possible to override the save behavior via SaveAsync.
  • Changed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand> so that it now requires an instance of Ddd.Threading.IAggregateCoordinator as a parameter on construction (Breaking Change).
  • Changed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand>.Generate so that an aggregate is no longer required in return.
  • Changed Architecture.Ddd.Services.CoordinatedHandler<TAggregate, TCommand> so that it now requires an instance of Ddd.Threading.IAggregateCoordinator as its sole parameter on construction (Breaking Change).
  • Changed Architecture.Ddd.Services.CoordinatedHandler<TAggregate, TCommand>.ExecuteAsync so that it now obtains the coordination context from a virtual new method named IdentifyCoordinationContextAsync (Breaking Change).
  • Changed Architecture.Ddd.Services.CoordinatedReactionHandler<TAggregate, TCommand> so that it now requires an instance of Ddd.Threading.IAggregateCoordinator as a parameter on construction (Breaking Change).
  • Changed Architecture.Ddd.Services.IProjector<TAggregate, TProjection>.ProjectAsync to include an optional context parameter (Breaking Change).-
  • Changed Architecture.Ddd.Services.Reconciliation.AggregateReconciler so that it now accepts an optional IDiagnosticsProxy.
  • Changed Architecture.Ddd.Services.Reconciliation.DefaultAggregateReconciler so that it no longer accepts a coordination timeout (it is now up to the proxies to coordinate if required) (Breaking Change).
  • Changed Architecture.Ddd.Services.Repository so that it now accepts an optional IDiagnosticsProxy.
  • Changed Architecture.Ddd.Specifications.Ensure.ArgumentSatisifies (now Satisifies) so that a default value can now be passed and used if the argument fails to pass the assertion.
  • Changed Architecture.Ddd.Specifications.Ensure.ArgumentSatisifies (now Satisifies) so that the message is now a named optional parameter (Breaking Change).
  • Changed Architecture.Ddd.Specifications.Ensure.ArgumentSatisifies (now Satisifies) so that the name of the argument is now optional (Breaking Change).
  • Changed Architecture.Entity to implement Threading.ICoordinatable via the Id property.
  • Changed Architecture.Entity.ToString so that the call is now forwarded to the ToString method for the instance held by the Id property.
  • Changed Architecture.Message so that constructor parameter context (of type Message) is now an optional parameter.
  • Changed Architecture.Message to implement Threading.ICoordinatable via the CorrelationId property.
  • Changed Architecture.Reference to implement Threading.ICoordinatable via the Id property.
  • Changed Architecture.Services.Bus so that it now accepts an optional IDiagnosticsProxy.
  • Changed to target v7.x of MooVC (Breaking Change).
  • Removed Architecture.Cqrs.Services.EnumerableResult in favour of Architecture.Cqrs.Services.EnumerableResult<TQuery, T> (Breaking Change).
  • Removed Architecture.Cqrs.Services.IQueryEngine.QueryAsync in favour of Architecture.Cqrs.Services.IQueryEngine.QueryAsync<TQuery, TResult>(Breaking Change).
  • Removed Architecture.Cqrs.Services.IQueryHandler in favour of Architecture.Cqrs.Services.IQueryHandler<TQuery, TResult> (Breaking Change).
  • Removed Architecture.Cqrs.Services.PaginatedQuery in favour of Architecture.Cqrs.Services.PaginatedResult<TQuery, T> (Breaking Change).
  • Removed Architecture.Cqrs.Services.PaginatedResult in favour of Architecture.Cqrs.Services.PaginatedResult<TQuery, T> (Breaking Change).
  • Removed Architecture.Cqrs.Services.Result in favour of Architecture.Cqrs.Services.Result<TQuery, T> (Breaking Change).
  • Removed Architecture.Cqrs.Services.SynchronousQueryHandler in favour of Architecture.Cqrs.Services.SynchronousQueryHandler<TQuery, TResult> (Breaking Change).
  • Removed Architecture.Ddd.AggregateRootExtensions.CoordinateAsync (Breaking Change).
  • Removed Architecture.Ddd.ReferenceExtensions.CoordinateAsync (Breaking Change).
  • Removed Architecture.Ddd.Services.Bus.OnDiagnosticsEmittedAsync in favour of a new protected Diagnostics property that enabled access to diagnostics emission (Breaking Change).
  • Removed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand>.IdentifyTarget in favour of IdentifyCoordinationContextAsync or IdentifyCoordinationContext (Breaking Change).
  • Removed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand>.PerformCoordinatedExecuteAsync in favor of PerformExecuteAsync (Breaking Change).
  • Removed Architecture.Ddd.Services.Reconciliation.AggregateReconciler.OnDiagnosticsEmittedAsync in favour of a new protected Diagnostics property that enabled access to diagnostics emission (Breaking Change).
  • Removed Architecture.Ddd.Services.Repository.OnDiagnosticsEmittedAsync in favour of a new protected Diagnostics property that enabled access to diagnostics emission (**Breaking ...
Read more

9.4.0: .NET 7

Choose a tag to compare

@MooVC MooVC released this 11 Nov 15:26
5ca9e39

Enhancements

  • Added support for .NET 7

9.3.0: Improved CoordinatedContextHandler Extensibility

Choose a tag to compare

@MooVC MooVC released this 22 Jun 10:26
3b9ba43

Enhancements

  • Changed Ddd.Services.CoordinatedContextHandler so that the Retrieve and Save behaviors can now be overridden.

9.2.0: Request Enhancements

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 21 Jun 17:24
26450f4

Enhancements

  • Added a new Ddd.Collections.EnumerableExtensions.ToReferences extension that will return an enumerable of references based on a collection of aggregates.
  • Added a new Request that serves as a derivation of Request capable of supporting explicit specification of the context type.
  • Changed Request so that it can now be implicit cast to the Message that serves as the Context.

Bug Fixes

  • Fixed a bug that caused exception messages generated by extension Ddd.Specifications.ArgumentSatisifies to contain leading whitespace.

9.1.0: Specifications & Value Enhancements

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 31 Jan 16:54
cc777aa

Enhancements

  • Added a new Architecture.ImplicitValue, intended to faciliate generation of domain rich types for properties that are typically represented using primiative types.
  • Added a new Architecture.Ddd.Specifications.Ensure.ArgumentSatisifies that can be used to ensure a argument satifies the conditions associated with a given specification.

9.0.0: NET 6, MooVC 6.x & Aggregate Reference Enhancements

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 06 Dec 17:11
f612054

Overview

This release focuses on addressing weaknesses in the handling of aggregate references, specifically, mismatches between their types depending on how they are created.

Enhancements

  • Added a new Architecture.Cqrs.Services.Result that can be used to encapsulate a result of a query.
  • Added a new Architecture.Cqrs.Services.EnumerableResult that can be used to encapsulate a result that contains a collection.
  • Added a new Architecture.Ddd.GuidExtensions.ToReference extension that acts as a shortcut to the new type centric Architecture.Ddd.Reference.Create variant.
  • Added a new Architecture.Ddd.Services.CoordinatedContextHandler that can be used to coorindate an operation in the context of an aggregate.
  • Added a new Architecture.Ddd.Services.CoordinatedReactionHandler that can be used to coorindate a reaction to an event in the context of the aggregate from which it was emitted.
  • Added a new Architecture.Ddd.Services.Ensure.AggregateDoesNotConflict variant that accepts a nullable aggregate as the current version.
  • Changed Architecture.Cqrs.Services.PaginatedResult so that it now inherits from Architecture.Cqrs.Services.EnumerableResult (breaking change).
  • Changed Architecture.Ddd.AggregateHasUncommittedChangesException so that it now has a constructor capable of accepting an AggregateRoot instance.
  • Changed Architecture.Ddd.AggregateEventSequenceUnorderedException so that it now has a constructor capable of accepting an AggregateRoot instance.
  • Changed Architecture.Ddd.AggregateEventMismatchException so that it now has a constructor capable of accepting an AggregateRoot instance.
  • Changed Architecture.Ddd.AggregateHistoryInvalidForStateException so that it now has a constructor capable of accepting an AggregateRoot instance.
  • Changed Architecture.Ddd.DomainEvent so that it can now be implicitly cast to an untyped reference.
  • Changed Architecture.Ddd.DomainEvent so that it can now be implicitly cast to a typed reference.
  • Changed Architecture.Ddd.Ensure.ReferenceIsOfType so that it will return as long as the type of the reference can be assigned to the generic type provided.
  • Changed Architecture.Ddd.Projection so that it can now be implicitly cast to a reference.
  • Changed Architecture.Ddd.Projection so that it can now be equated to a reference.
  • Changed Architecture.Ddd.Reference so that it can now be implicitly cast to its constituent parts (Id, Type, Version).
  • Changed Architecture.Ddd.Reference so that it now has a static Create variant, capable of directly accepting an aggregate instance.
  • Changed Architecture.Ddd.Reference so that it now has a static Create variant, capable of directly accepting a type instance.
  • Changed Architecture.Ddd.Reference so that it now has a static Create variant, capable of accepting a genertic AggregateRoot type.
  • Changed Architecture.Ddd.Reference so that it is now marked as abstract (breaking change).
  • Changed Architecture.Ddd.Reference so that it no longer accepts an aggregate as a constructor argument (breaking change).
  • Changed Architecture.Ddd.Reference so that it will now return a custom formatted string when ToString is invoked.
  • Changed Architecture.Ddd.Reference.Create so that the type parameter now comes after the id parameter (breaking change).
  • Changed Architecture.Ddd.Reference so that its constructors are now internal only (breaking change).
  • Changed Architecture.Ddd.Reference so that it now has a static Create variant, capable of accepting an id and optional version.
  • Changed Architecture.Ddd.Ensure.ReferenceIsNotEmpty so that it now returns the tested reference.
  • Changed Architecture.Ddd.Ensure.ReferenceIsOfType so that it now returns the tested reference.
  • Changed Architecture.Ddd.ReferenceExtensions.ToTyped now accepts and validates a nullable reference.
  • Changed Architecture.Ddd.ReferenceExtensions.ToTyped now accepts and validates a nullable reference.
  • Changed Architecture.Ddd.Services.CoordinatedOperationHandler so that it now inherits from Architecture.Ddd.Services.CoordinatedContextHandler;
  • Changed Architecture.Ddd.SignedVersion so that the custom formatted string retutned when ToString is invoked now takes account of the empty state.
  • Changed Architecture.Ddd.SignedVersion so that it can now be implicitly cast to its constituent parts (Number, Signature).
  • Changed to target NET 6 in addition to NET 5 and NET Standard 2.1.
  • Moved Architecture.Serialization to Architecture.Ddd.Serialization as it contained items that solely related to Ddd (breaking change).
  • Renamed Architecture.Cqrs.Services.PaginatedResult.TotalPages to Pages (breaking change).
  • Renamed Architecture.Cqrs.Services.PaginatedResult.TotalResults to Total (breaking change).
  • Updated to MooVC V6.* (breaking change).

Bug Fixes

  • Fixed a bug that would cause an reference to be incorrectly deserialized whenever it was originally serialized as an untyped reference.

8.1.0: Extension Enhancements

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 09 Sep 08:28
897b39c

Enhancements

  • Changed Ddd.ReferenceExtensions.IsEmpty so that the input is flagged as not null when the return value is false.

Bug Fixes

  • Ddd.Services.RepositoryExtensions.GetAsync now correctly throws an AggregateNotFoundException if a specific version of the aggregate has not been specified.

8.0.0: Serialization

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 06 Aug 12:50
a78c7ce

Overview

This release focuses on the standardizing the concept of serialization as defined by MooVC.

Enhancements

  • Changed to target MooVC v5.0.0 (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.ConcurrentMemoryRepository so that the ICloner is now a required argument (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.MemoryRepository so that the ICloner is now a required argument (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.SynchronousRepository so that it now requires an instance of ICloner on construction (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.SynchronousRepository so that the recipient of a call to PerformUpdateStore now receives a clone of the aggregate, instead of the original aggregate (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.UnversionedMemoryRepository so that the ICloner is now a required argument (Breaking Change).
  • Changed MooVC.Architecture.Ddd.Services.VersionedMemoryRepository so that the ICloner is now a required argument (Breaking Change).
  • Changed MooVC.Architecture.Ddd.SignedVersion to include a new variant of IsNext that can accept a footer and number directly, facilitating custom conflict handling (Breaking Change).

Bug Fixes

  • Fixed a bug where a GetAllAsync call to any derivations of MemoryRepository resulted in the recipient receiving a reference to the original aggregate within the store.

7.0.0: Async Events & Cancellation Tokens

Choose a tag to compare

@ControlSoft-Automation ControlSoft-Automation released this 22 Jul 16:02
003d07b

Overview

Custom event handlers have been changed to use the asynchonrous variant. This is seen as a positive step forward as more libraries adopt the asynchonrous programming paradigm. By utilizng asynchonrous handlers, observers can avoid utilizing async void implementations whereever a need for asynchonrous exists. Clarity has also been provided on cancellations, which in the past, where supported for every event, even if this was not the original intention. Cancellation tokens have also been added as optional parameters to every public and protected method, facilitating top level cancellation by allowing the token to be propagated throughout the solution.

Enhancements

  • Added a new ToGuid method to Ddd.SignedVersion, enabling the caller to produce a GUID based on the Header and Footer of the version.
  • Added a new Ddd.Collections.UnversionedReferenceDictionary to simplify lookups based on reference when aggregate versioning does not apply.
  • Added a new Ddd.Collections.DictionaryExtensions.ToUnversioned to simplify conversion of an existing dictionary into an unversioned variant.
  • Added a new Ddd.Collections.EnumerableExtensions.ToUnversionedDictionary to simplify conversion of an existing collection of aggregates or projections into an unversioned index of the same.
  • Added a new Ddd.ReferenceExtensions.ToUnversioned extension to facilitate the creation of an unversioned reference based on the reference supplied if that reference was versioned, otherwise it will return the same reference.
  • Added a new Ddd.Services.IAggregateFactory to support aggregate creation when the explicit type is not known.
  • Added a new Ddd.Services.CoordinatedHandler to support coordinated handling of generic operations in the context of an aggregate type.
  • Added a new Ddd.Services.DefaultAggregateFactory to provide a default implementation for aggregate creation when the explicit type is not known.
  • Added a TimeStamp to Ddd.SignedVersion which defaults to MinValue if no value was previously serialized.
  • Applied optional cancellation tokens to every public and protected async method, thereby facilitating propagation of cancellation tokens (Breaking Change).
  • Changed Ddd.AggregateRootExtensions.ToReference to include an optional switch to facilitate creation of an unversioned reference for the aggregate supplied.
  • Changed Ddd.Services.AggregateSavedEventHandler to an async variant named AggregateSavedAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.AggregateSavingAsyncEventHandler to an async variant named AggregateSavingAsyncEventHandler (Breaking Change).
  • Changes Ddd.Services.CoordinatedGenerateHandler to inherit from Ddd.Services.CoordinatedHandler.
  • Changed Ddd.Services.DomainEventsPublishedEventHandler to an async variant named DomainEventsPublishedAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.DomainEventsPublishingEventHandler to an async variant named DomainEventsPublishingAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.AggregateConflictDetectedEventHandler to an async variant named AggregateConflictDetectedAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.AggregateReconciledEventHandler to an async variant named AggregateReconciledAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.IAggregateReconciliationProxy so that it no longer implements CreateAsync (Breaking Change).
  • Changed Ddd.Services.Reconciliation.EventsReconciledEventHandler to an async variant named EventsReconciledAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.EventsReconcilingEventHandler to an async variant named EventsReconcilingAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.EventSequenceAdvancedEventHandler to an async variant named EventSequenceAdvancedAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.SnapshotRestorationCompletedEventHandler to an async variant named SnapshotRestorationCompletedAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Reconciliation.SnapshotRestorationCommencingEventHandler to an async variant named SnapshotRestorationCommencingAsyncEventHandler (Breaking Change).
  • Changed Ddd.Services.Repository so that it now implements IEmitDiagnostics.
  • Changed Services.Bus so that it now implements IEmitDiagnostics.
  • Changed Services.MessageInvokedEventHandler to an async variant named MessageInvokedAsyncEventHandler (Breaking Change).
  • Changed Services.MessageInvokingEventHandler to an async variant named MessageInvokingAsyncEventHandler (Breaking Change).
  • Changed the invocation of the AggregateReconciled event handler of Ddd.Services.AggregateReconciler to utilize the passive implementation (Breaking Change).
  • Changed the invocation of the AggregateSaved event handler of Ddd.Services.Repository to utilize the passive implementation (Breaking Change).
  • Changed the invocation of the EventsReconciled event handler of Ddd.Services.Reconciliation.EventReconciler to utilize the passive implementation (Breaking Change).
  • Changed the invocation of the Published event handler of Ddd.Services.Bus to utilize the passive implementation (Breaking Change).
  • Changed the invocation of the Invoked event handler of Services.Bus to utilize the passive implementation (Breaking Change).
  • Changed the invocation of the SequenceAdvanced event handler of Ddd.Services.Reconciliation.EventReconciler to utilize the passive implementation (Breaking Change).
  • Removed Ddd.Services.Reconciliation.SynchronousAggregateReconciler due to inherrant challenges presented by the event driven feedback model (Breaking Change).
  • Renamed Ddd.ReferenceExtensions.ToTypedReference to Ddd.ReferenceExtensions.ToTyped (Breaking Change).

End-User Impact

In many cases, it is expected that event handlers can be updated by simply:

  1. Changing the return type from void to Task.
  2. Returning Task.CompletedTask.

Passive handlers will no longer require that the observer handle exceptions.