Class EfCoreTracedAggregateRepository<TEntity, TKey, TMarker>
- 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
TEntityThe type of the entity that implements the TracedAggregateRoot<TKey> interface.
TKeyThe type of the key that uniquely identifies the entity.
TMarkerThe type used to mark the implementation that this repository represents. Optimized for Microsoft Dependency Injection.
- Inheritance
-
EfCoreTracedAggregateRepository<TEntity, TKey>EfCoreTracedAggregateRepository<TEntity, TKey, TMarker>
- Implements
-
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>
- 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
sourceIEfCoreDataSource<TMarker>The IEfCoreDataSource<TMarker> that handles actual I/O communication with a source of data.
marshallerIMarshallerThe IMarshaller that is used when converting between ITracedDomainEvent and arbitrary data.