Код: Выделить всё
_services.AddMassTransit(busConfigurator =>
{
busConfigurator.SetKebabCaseEndpointNameFormatter();
busConfigurator.AddConsumersFromNamespaceContaining();
busConfigurator.AddEntityFrameworkOutbox(options =>
{
options.UseSqlServer();
options.UseBusOutbox();
});
busConfigurator.AddConfigureEndpointsCallback((IRegistrationContext context, string name, IReceiveEndpointConfigurator cfg) =>
{
cfg.UseEntityFrameworkOutbox(context);
});
busConfigurator.UsingRabbitMq((context, configurator) =>
{
var settings = context.GetRequiredService();
configurator.Host(new Uri(settings.Host), h =>
{
h.Username(settings.Username);
h.Password(settings.Password);
});
configurator.ConfigureEndpoints(context);
});
});
Код: Выделить всё
modelBuilder.AddTransactionalOutboxEntities();
Код: Выделить всё
public override async ValueTask SavedChangesAsync(SaveChangesCompletedEventData eventData, int result, CancellationToken cancellationToken = default)
{
var bus = _serviceScope.ServiceProvider.GetRequiredService();
var context = eventData.Context;
if (context is null)
return await base.SavedChangesAsync(eventData, result, cancellationToken);
var events = context.ChangeTracker
.Entries()
.Select(a => a.Entity)
.Where(e => e.GetDomainEvents() is not null)
.SelectMany(e =>
{
var domainEvents = e.GetDomainEvents();
e.ClearDomainEvents();
return domainEvents;
});
foreach(var domainEvent in events)
await bus.PublishAsync(domainEvent, cancellationToken);
return await base.SavedChangesAsync(eventData, result, cancellationToken);
}
Код: Выделить всё
public async Task PublishAsync(object message, CancellationToken cancellationToken = default)
{
_logger.LogDebug("Publishing event {@Event}", message);
await _endpoint.Publish(message, (context) =>
{
context.Headers.Set("jwtToken", _contextAccessor.GetJwtTokenFromAuthHeader());
}, cancellationToken);
}
Опять же, все работает отлично без исходящих сообщений. Что я делаю не так?
Подробнее здесь: https://stackoverflow.com/questions/788 ... g-messages