Sparen von Domain -Ereignissen auf der Entität im Unternehmen Framework (COSMOSDB)
Posted: 21 Mar 2025, 06:40
folgt domänengetriebenes Design versuche ich, ein Operationsbox-Muster zu implementieren, das Domänenereignisse in einem Aggregateroot abgeleitete Entität in derselben "Transaktion" in CosmosDB speichert. />https://github.com/dotnet/efcore/issues/17308
Basisklasse:
Wie Sie sehen können, kann IdomaineEvent mehrere Implementierungen haben und müssen auf die richtigen Typen serialisiert/deserialisiert werden. Ich habe dies an der einzelnen Entität gearbeitet, indem ich in der EntityTypeConfiguration :
durchgeführt wurde
Idealerweise möchte ich dies auf alle Klassen anwenden, die von Aggregateroot Basisklasse abgeleitet sind, dies jedoch keinen Weg finden, dies zu tun. Ich habe auch versucht, die folgenden DBContext zu verwenden, kann jedoch keinen Weg finden, um den Typinforesolver in für JsonSerializer :
zu übergeben
Hat jemand eine Idee, wie ich das Ziel erreichen kann. Ich kann garantieren, dass ich diese Ereignisse gleichzeitig speichern kann, während ich Savechanges () im dbContext aufrufen kann? Dies muss nicht die Verwendung von JsonSerializer enthalten, aber dies ist so nah wie ich bisher gekommen bin.
Code: Select all
AggregateRoot
Code: Select all
public abstract class AggregateRoot : IDomainEventAccumulator where TAggregate : AggregateRoot
{
public Guid Id { get; protected set; } = Guid.NewGuid();
public ICollection DomainEvents { get; } = new List();
protected void AddDomainEvent(IDomainEvent domainEvent)
{
DomainEvents.Add(domainEvent);
}
...
}
< /code>
Abgeleitete Klasse: < /p>
public class Partner : AggregateRoot
{
public Partner(string name)
{
Name = name;
AddDomainEvent(new PartnerCreatedEvent(Id));
}
}
durchgeführt wurde
Code: Select all
public class PartnerConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToContainer(nameof(CosmosDbContext.Partners));
builder.HasPartitionKey(d => d.Id);
var assembly = Assembly.Load("MyApplication.Domain");
var domainEventTypes = assembly.GetTypes().Where(t => typeof(IDomainEvent)
.IsAssignableFrom(t) && !t.IsAbstract)
.ToArray();
var serializerOptions = new JsonSerializerOptions()
{
TypeInfoResolver = new EventTypeResolver(domainEventTypes)
};
builder.Property(c => c.DomainEvents).HasConversion(
v => JsonSerializer.Serialize(v, serializerOptions),
v => JsonSerializer.Deserialize(v, serializerOptions));
}
}
zu übergeben
Code: Select all
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Properties(c => c.HaveConversion());
}