Table of Contents

Class EfCoreAggregateRepository<TEntity, TKey, TMarker>

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

Provides an implementation of the EfCoreRepository<TEntity, TKey> that is optimized for Domain Driven Design.

public class EfCoreAggregateRepository<TEntity, TKey, TMarker> : EfCoreRepository<TEntity, TKey>, IAggregateRepository<TEntity, TKey, TMarker>, IAggregateRepository<TEntity, TKey>, IPersistentRepository<TEntity, TKey, TMarker>, IPersistentRepository<TEntity, TKey>, IWritableRepository<TEntity, TKey, TMarker>, IWritableRepository<TEntity, TKey>, IReadableRepository<TEntity, TKey, TMarker>, IReadableRepository<TEntity, TKey>, ISearchableRepository<TEntity, TKey, TMarker>, ISearchableRepository<TEntity, TKey>, IDeletableRepository<TEntity, TKey, TMarker>, IRepository<TEntity, TKey, TMarker>, IDependencyInjectionMarker<TMarker>, IDeletableRepository<TEntity, TKey>, IRepository<TEntity, TKey> where TEntity : class, IAggregateRoot<IDomainEvent, TKey>

Type Parameters

TEntity

The type of the entity.

TKey

The type of the key that uniquely identifies the entity.

TMarker

The type used to mark the implementation that this repository represents. Optimized for Microsoft Dependency Injection.

Inheritance
EfCoreRepository<TEntity, TKey>
EfCoreAggregateRepository<TEntity, TKey, TMarker>
Implements
IAggregateRepository<TEntity, TKey, TMarker>
IAggregateRepository<TEntity, TKey>
IPersistentRepository<TEntity, TKey, TMarker>
IPersistentRepository<TEntity, TKey>
IWritableRepository<TEntity, TKey, TMarker>
IWritableRepository<TEntity, TKey>
IReadableRepository<TEntity, TKey, TMarker>
IReadableRepository<TEntity, TKey>
ISearchableRepository<TEntity, TKey, TMarker>
ISearchableRepository<TEntity, TKey>
IDeletableRepository<TEntity, TKey, TMarker>
IRepository<TEntity, TKey, TMarker>
IDeletableRepository<TEntity, TKey>
IRepository<TEntity, TKey>
Inherited Members

Examples

The DI-registered EfCoreAggregateRepository<TAggregateRoot, TKey, TContext> resolves as IAggregateRepository<TAggregateRoot, TKey> when registered via AddEfCoreAggregateRepository. The aggregate data source registered by AddEfCoreAggregateDataSource provides the context. The example registers both services and resolves the repository interface.

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

namespace ExampleApp;

public sealed class MarkerAggregateRepositoryExample
{
    public bool IsResolvedAsMarkedAggregateRepository()
    {
        var services = new ServiceCollection();
        services.AddEfCoreDataSource<OrderingMarker>(options =>
        {
            options.ContextConfigurator = builder => builder.EnableDetailedErrors();
            options.ModelConstructor = modelBuilder => modelBuilder.Entity<OrderAggregate>().HasKey(order => order.Id);
        });
        services.AddEfCoreAggregateRepository<OrderAggregate, Guid, OrderingMarker>();

        using var provider = services.BuildServiceProvider();
        var repository = provider.GetRequiredService<IAggregateRepository<OrderAggregate, Guid, OrderingMarker>>();

        return repository is EfCoreAggregateRepository<OrderAggregate, Guid, OrderingMarker>;
    }
}

public sealed class OrderingMarker
{
}

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

Constructors

EfCoreAggregateRepository(IEfCoreDataSource<TMarker>)

Initializes a new instance of the EfCoreRepository<TEntity, TKey, TMarker> class.

public EfCoreAggregateRepository(IEfCoreDataSource<TMarker> source)

Parameters

source IEfCoreDataSource<TMarker>

The IEfCoreDataSource<TMarker> that handles actual I/O communication with a source of data.

See Also

EfCoreRepository<TEntity, TKey>
IPersistentRepository<TEntity, TKey, TMarker>