Этот вопрос конкретно относится к eshoponcontainers https://github.com/dotnet-architecture/eShopOnContainers и, более конкретно, к сервису IntegrationEvengLog.
У меня есть следующий класс, который мне нужно сменить, и он передан
IEventsContextIntegrationEventService integrationService = NEEDS MOCKING;
var handler = new CreateCoinCommandHandler(context, mapper, integrationService);`
Я уже высмеял context
с помощью dbcontext в памяти, маппер уже позаботился, единственный параметр, который мне нужен, это integrationService
, который также принимает context
, и у него есть свой собственный dbcontext, который должен быть
Вот мой класс службы интеграции, который я не знаю, как правильно смоделировать (предпочитаю использовать в памяти, как я, для `context.
Извините за неопределенность, ноне уверен как еще это поставить
public class EventsContextIntegrationEventService: IEventsContextIntegrationEventService
{
private readonly Func<DbConnection, IIntegrationEventLogService> integrationEventLogServiceFactory;
private readonly IEventBus eventBus;
private readonly EventsContext context;
private readonly IIntegrationEventLogService eventLogService;
public EventsContextIntegrationEventService(IEventBus eventBus, EventsContext context,
Func<DbConnection, IIntegrationEventLogService> integrationEventLogServiceFactory)
{
this.context = context ?? throw new ArgumentNullException(nameof(context));
this.integrationEventLogServiceFactory = integrationEventLogServiceFactory ?? throw new ArgumentNullException(nameof(integrationEventLogServiceFactory));
this.eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus));
eventLogService = this.integrationEventLogServiceFactory(this.context.Database.GetDbConnection());
}
public async Task PublishThroughEventBusAsync(IntegrationEvent evt)
{
try
{
await eventLogService.MarkEventAsInProgressAsync(evt.Id);
eventBus.Publish(evt);
await eventLogService.MarkEventAsPublishedAsync(evt.Id);
}
catch (Exception)
{
await eventLogService.MarkEventAsFailedAsync(evt.Id);
}
}
public async Task SaveIntegrationEventAndEventContextChangesAsync(IntegrationEvent evt)
{
//Use of an EF Core resiliency strategy when using multiple DbContexts within an explicit BeginTransaction():
//See: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
await ResilientTransaction.New(context)
.ExecuteAsync(async () => {
// Achieving atomicity between original catalog database operation and the IntegrationEventLog thanks to a local transaction
await context.SaveChangesAsync();
await eventLogService.SaveEventAsync(evt, context.Database.CurrentTransaction.GetDbTransaction());
});
}
}