Table of Contents

Class EfCoreAggregateDataSource<TMarker>

Namespace
Savvyio.Extensions.DependencyInjection.EFCore.Domain
Assembly
Savvyio.Extensions.DependencyInjection.EFCore.Domain.dll

Provides an implementation of the EfCoreDataSource that is optimized for Domain Driven Design and the concept of Aggregate Root.

public class EfCoreAggregateDataSource<TMarker> : EfCoreAggregateDataSource, IDisposable, IEfCoreDataSource<TMarker>, IEfCoreDataSource, IDataSource<TMarker>, IDataSource, IUnitOfWork<TMarker>, IUnitOfWork, IDependencyInjectionMarker<TMarker>

Type Parameters

TMarker
Inheritance
EfCoreAggregateDataSource<TMarker>
Implements
IDataSource<TMarker>
IUnitOfWork<TMarker>
Inherited Members

Examples

This example shows how EfCoreAggregateDataSource<TMarker> can be resolved from DI when an aggregate store needs a marker-specific pipeline.

using System;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Savvyio.Domain;
using Savvyio.Extensions.DependencyInjection.EFCore;
using Savvyio.Extensions.DependencyInjection.EFCore.Domain;

namespace ExampleApp;

public sealed class MarkerAggregateDataSourceExample
{
    public bool IsResolvedAsMarkedAggregateSource()
    {
        var services = new ServiceCollection();
        services.AddSingleton<IDomainEventDispatcher, RecordingDomainEventDispatcher>();
        services.AddEfCoreAggregateDataSource<OrderingMarker>(options =>
        {
            options.ContextConfigurator = builder => builder.EnableDetailedErrors();
            options.ModelConstructor = modelBuilder => modelBuilder.Entity<OrderAggregate>().HasKey(order => order.Id);
        });

        using var provider = services.BuildServiceProvider();
        var source = provider.GetRequiredService<IEfCoreDataSource<OrderingMarker>>();

        return source is EfCoreAggregateDataSource<OrderingMarker>;
    }
}

public sealed class OrderingMarker
{
}

public sealed class RecordingDomainEventDispatcher : IDomainEventDispatcher
{
    public void Raise(IDomainEvent request)
    {
    }

    public Task RaiseAsync(IDomainEvent request, Action<Cuemon.Threading.AsyncOptions>? setup = null)
    {
        return Task.CompletedTask;
    }
}

public sealed class OrderAggregate : Aggregate<Guid, IDomainEvent>, IAggregateRoot<IDomainEvent, Guid>
{
    public OrderAggregate(Guid id) : base(id)
    {
    }
}

Constructors

EfCoreAggregateDataSource(IDomainEventDispatcher, EfCoreDataSourceOptions<TMarker>)

Initializes a new instance of the EfCoreAggregateDataSource class.

public EfCoreAggregateDataSource(IDomainEventDispatcher dispatcher, EfCoreDataSourceOptions<TMarker> options)

Parameters

dispatcher IDomainEventDispatcher

The IDomainEventDispatcher that are responsible for raising domain events.

options EfCoreDataSourceOptions<TMarker>

The EfCoreDataSourceOptions<TMarker> used to configure this instance.

See Also