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

Ein Treffpunkt für C#-Programmierer
Anonymous
 Sparen von Domain -Ereignissen auf der Entität im Unternehmen Framework (COSMOSDB)

Post by Anonymous »

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

Code: Select all

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

Code: Select all

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Properties(c => c.HaveConversion());
}
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post