/MooVC.Architecture

A framework designed to support the rapid development of applications that adhere to the Domain Driven Design architectural style.

Primary LanguageC#MIT LicenseMIT

moovc.architecture

Azure DevOps builds (branch)Azure DevOps tests (branch)
Azure DevOps builds (branch)Azure DevOps tests (branch)
NugetNuget (with prereleases)Nuget

The MooVC Architecture library is designed to support the rapid development of applications that adhere to the Domain Driven Design architectural style.

MooVC was originally created as a PHP based framework back in 2009, intended to support the rapid development of object-oriented web applications based on the Model-View-Controller design pattern that were to be rendered in well-formed XHTML. It is from this that MooVC gets its name - the Model-object-oriented-View-Controller.

While the original MooVC PHP based framework has long since been deprecated, many of the lessons learned from it have formed the basis of solutions the author has since developed. This library, and those related to it, are all intended to support the rapid development of high quality software that addresses a variety of use-cases.

Release v10.0.0

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 Change).
  • Removed Architecture.MessageExtensions.CoordinateAsync (Breaking Change).
  • Removed Architecture.ObjectExtensions.CoordinateAsync (Breaking Change).
  • Removed Architecture.Services.Bus.OnDiagnosticsEmittedAsync in favour of a new protected Diagnostics property that enabled access to diagnostics emission (Breaking Change).
  • Removed Architecture.TypeExtensions.CoordinateAsync (Breaking Change).
  • Removed support for .Net 5 (Breaking Change).
  • Removed support for .Net Standard 2.1 (Breaking Change).
  • Renamed Architecture.Ddd.Ensure.ReferenceIsNotEmpty to Architecture.Ddd.Ensure.IsNotEmpty (Breaking Change).
  • Renamed Architecture.Ddd.Ensure.ReferenceIsOfType to Architecture.Ddd.Ensure.IsOfType (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand>.PerformCoordinatedExecuteAsync to PerformExecuteAsync (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand>.PerformCoordinatedRetrieveAsync to RetrieveAsync (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedContextHandler<TAggregate, TCommand>.PerformCoordinatedSaveAsync to SaveAsync (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand>.PerformCoordinatedGenerate to Generate (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedGenerateHandler<TAggregate, TCommand>.PerformSupplementalActivitiesAsync to VerifyAsync (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedHandler<TAggregate, TCommand>.PerformCoordinatedExecuteAsync to PerformExecuteAsync (Breaking Change).
  • Renamed Architecture.Ddd.Services.CoordinatedOperationHandler.PerformCoordinatedOperation to Apply (Breaking Change).
  • Renamed Architecture.Ddd.Services.Ensure.AggregateDoesNotConflict to Architecture.Ddd.Services.Ensure.DoesNotConflict (Breaking Change).
  • Renamed Architecture.Ddd.Services.IRepository.AggregateSaved to Saved (Breaking Change).
  • Renamed Architecture.Ddd.Services.IRepository.AggregateSaving to Saving (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IAggregateReconciler.AggregateConflictDetected to ConflictDetected (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IAggregateReconciler.AggregateReconciled to Reconciled (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IAggregateReconciler.UnsupportedAggregateTypeDetected to UnsupportedTypeDetected (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IEventReconciler.EventSequenceAdvanced to SequenceAdvanced (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IEventReconciler.EventsReconciled to Reconciled (Breaking Change).
  • Renamed Architecture.Ddd.Services.Reconciliation.IEventReconciler.EventsReconciling to Reconciling (Breaking Change).
  • Renamed Architecture.Ddd.Specifications.Ensure.ArgumentSatisifies to Architecture.Ddd.Specifications.Ensure.Satisifies (Breaking Change).