Table of Contents

Class EfCoreTracedAggregateRepository<TEntity, TKey, TMarker>

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

Provides an implementation of the EfCoreTracedAggregateRepository<TEntity, TKey> that is optimized for Domain Driven Design and Event Sourcing.

public class EfCoreTracedAggregateRepository<TEntity, TKey, TMarker> : EfCoreTracedAggregateRepository<TEntity, TKey>, ITracedAggregateRepository<TEntity, TKey, TMarker>, ITracedAggregateRepository<TEntity, TKey>, IReadableRepository<TEntity, TKey, TMarker>, IReadableRepository<TEntity, TKey>, IWritableRepository<TEntity, TKey, TMarker>, IRepository<TEntity, TKey, TMarker>, IDependencyInjectionMarker<TMarker>, IWritableRepository<TEntity, TKey>, IRepository<TEntity, TKey> where TEntity : class, ITracedAggregateRoot<TKey>

Type Parameters

TEntity

The type of the entity that implements the TracedAggregateRoot<TKey> interface.

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
EfCoreTracedAggregateRepository<TEntity, TKey, TMarker>
Implements
ITracedAggregateRepository<TEntity, TKey, TMarker>
IReadableRepository<TEntity, TKey, TMarker>
IReadableRepository<TEntity, TKey>
IWritableRepository<TEntity, TKey, TMarker>
IRepository<TEntity, TKey, TMarker>
IWritableRepository<TEntity, TKey>
IRepository<TEntity, TKey>
Inherited Members

Examples

This example shows how EfCoreTracedAggregateRepository<TEntity, TKey, TMarker> can be resolved when event-sourced aggregates need both a marker and a marshaller.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Savvyio;
using Savvyio.Domain.EventSourcing;
using Savvyio.Extensions.DependencyInjection;
using Savvyio.Extensions.DependencyInjection.Domain.EventSourcing;
using Savvyio.Extensions.DependencyInjection.EFCore;
using Savvyio.Extensions.DependencyInjection.EFCore.Domain.EventSourcing;
using Savvyio.Extensions.EFCore.Domain.EventSourcing;
using Savvyio.Handlers;

namespace ExampleApp;

public sealed class MarkerTracedRepositoryExample
{
    public bool IsResolvedAsMarkedTracedRepository()
    {
        var services = new ServiceCollection();
        services.AddMarshaller<SimpleMarshaller>();
        services.AddEfCoreDataSource<TimelineMarker>(options =>
        {
            options.ContextConfigurator = builder => builder.EnableDetailedErrors();
            options.ModelConstructor = modelBuilder => modelBuilder.AddEventSourcing<OrderTimeline, Guid>();
        });
        services.AddEfCoreTracedAggregateRepository<OrderTimeline, Guid, TimelineMarker>();

        using var provider = services.BuildServiceProvider();
        var repository = provider.GetRequiredService<ITracedAggregateRepository<OrderTimeline, Guid, TimelineMarker>>();

        return repository is EfCoreTracedAggregateRepository<OrderTimeline, Guid, TimelineMarker>;
    }
}

public sealed class TimelineMarker
{
}

public sealed class OrderTimeline : TracedAggregateRoot<Guid>
{
    public OrderTimeline(Guid id, string orderNumber) : base()
    {
        AddEvent(new OrderPlaced(id, orderNumber));
    }

    private OrderTimeline(Guid id, IEnumerable<ITracedDomainEvent> events) : base(id, events)
    {
    }

    protected override void RegisterDelegates(IFireForgetRegistry<ITracedDomainEvent> handler)
    {
        handler.Register<OrderPlaced>(_ => { });
    }
}

public sealed record OrderPlaced(Guid OrderId, string OrderNumber) : TracedDomainEvent;

public sealed class SimpleMarshaller : IMarshaller
{
    public Stream Serialize<TValue>(TValue value)
    {
        return new MemoryStream(JsonSerializer.SerializeToUtf8Bytes(value));
    }

    public Stream Serialize(object value, Type inputType)
    {
        return new MemoryStream(JsonSerializer.SerializeToUtf8Bytes(value, inputType));
    }

    public TValue Deserialize<TValue>(Stream data)
    {
        return JsonSerializer.Deserialize<TValue>(data)!;
    }

    public object Deserialize(Stream data, Type returnType)
    {
        return JsonSerializer.Deserialize(data, returnType)!;
    }
}

Constructors

EfCoreTracedAggregateRepository(IEfCoreDataSource<TMarker>, IMarshaller)

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

public EfCoreTracedAggregateRepository(IEfCoreDataSource<TMarker> source, IMarshaller marshaller)

Parameters

source IEfCoreDataSource<TMarker>

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

marshaller IMarshaller

The IMarshaller that is used when converting between ITracedDomainEvent and arbitrary data.

See Also

EfCoreTracedAggregateRepository<TEntity, TKey>
IReadableRepository<TEntity, TKey, TMarker>
IWritableRepository<TEntity, TKey, TMarker>