ServiceCollectionExtensions Class
Definition
- Namespace
- Savvyio.Extensions.DependencyInjection.EFCore.Domain
- Assemblies
- Savvyio.Extensions.DependencyInjection.EFCore.Domain.dll
Extension methods for the IServiceCollection interface.
public static class ServiceCollectionExtensions
- Inheritance
-
objectServiceCollectionExtensions
Examples
Registering domain aggregates backed by EF Core requires two registrations: AddEfCoreAggregateDataSource to bind the aggregate context as IEfCoreDataSource, and AddEfCoreAggregateRepository to add the repository on top. The aggregate data source sets the boundary for which context the repository uses; it must be registered first. The example registers both services and resolves the repository interface to confirm the aggregate wiring.
using System;
using System.Threading.Tasks;
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 AggregateRegistrationExample
{
public ServiceProvider BuildProvider()
{
var services = new ServiceCollection();
services.AddSingleton<IDomainEventDispatcher, RecordingDomainEventDispatcher>();
services.AddEfCoreAggregateDataSource(options =>
{
options.ContextConfigurator = builder => builder.EnableDetailedErrors();
options.ModelConstructor = modelBuilder => modelBuilder.Entity<OrderAggregate>().HasKey(order => order.Id);
});
services.AddEfCoreAggregateRepository<OrderAggregate, Guid>();
return services.BuildServiceProvider();
}
public bool HasExpectedRegistrations(ServiceProvider provider)
{
var repository = provider.GetRequiredService<IAggregateRepository<OrderAggregate, Guid>>();
return repository is Savvyio.Extensions.EFCore.Domain.EfCoreAggregateRepository<OrderAggregate, Guid>;
}
}
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)
{
}
}
Methods
| Name | Description |
|---|---|
| AddEfCoreAggregateDataSource(IServiceCollection, Action<EfCoreDataSourceOptions>, Action<ServiceOptions>) | Adds an EfCoreDataSource implementation to the specified IServiceCollection. |
| AddEfCoreAggregateDataSource<TMarker>(IServiceCollection, Action<EfCoreDataSourceOptions<TMarker>>, Action<ServiceOptions>) | Adds an EfCoreDataSource<TMarker> implementation to the specified IServiceCollection. |
| AddEfCoreAggregateRepository<TEntity, TKey>(IServiceCollection, Action<ServiceOptions>) | Adds an EfCoreAggregateRepository<TEntity, TKey> to the specified IServiceCollection. |
| AddEfCoreAggregateRepository<TEntity, TKey, TMarker>(IServiceCollection, Action<ServiceOptions>) | Adds an EfCoreAggregateRepository<TEntity, TKey, TMarker> to the specified IServiceCollection. |