Page 1 of 1

Sparen von Domain -Ereignissen auf der Entität im Unternehmen Framework (COSMOSDB)

Posted: 21 Mar 2025, 00:27
by Anonymous
Nach dem domänengesteuerten Design versuche ich, ein Operationsbox -Muster zu implementieren, das Domänenereignisse auf einem von Aggregateroot abgeleiteten Entität in derselben "Transaktion" in CosmosDB speichert. />https://github.com/dotnet/efcore/issues/17308
Aggregateroot-Basisklasse:

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);
}
...
}
Abgeleitete Klasse:

Code: Select all

public class Partner : AggregateRoot
{
public Partner(string name)
{
Name = name;
AddDomainEvent(new PartnerCreatedEvent(Id));
}
}
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 habe.

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));
}
}
< /code>
Idealerweise möchte ich dies auf alle Klassen anwenden, die aus der Basisklasse der Aggregateroot abgeleitet sind, aber keinen Weg finden, dies zu tun. Ich habe auch versucht, die folgenden [b] dbContext [/b] zu verwenden, kann jedoch keinen Weg finden, den Typinforesolver 
für JsonSerializer zu übergeben:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Properties(c => c.HaveConversion());
}
< /code>
Hat jemand eine Idee, wie ich das Ziel erreichen kann. Dies muss nicht die Verwendung von JsonSerializer enthalten, aber dies ist so nah wie ich bisher gekommen bin.