Реализация ISagaDbContextFactory для StructureMap

Есть ли реализация ISagaDbContextFactory для StructureMap? Я видел реализацию AutofacSagaDbContextFactory для Autofac, и я бы написал свою собственную для StructureMap, но я не знаю, какую полезную нагрузку искать, чтобы получить экземпляр вложенного контейнер, который я ожидал создать с помощью масстранзита ?? Я безуспешно пробовал следующее

public class StructureMapSagaDbContextFactory<TSaga> : ISagaDbContextFactory<TSaga> where TSaga : class, ISaga
{
  ...
  public DbContext CreateScoped<T>(ConsumeContext<T> context) where T : class
  {            
    if (context.TryGetPayload(out IContainer container)) // I don't know what to look for in the payload
      return currentScope.GetInstance<MyDbContext>();

    return Create();
  }
  ...
}

MyDbContext зарегистрирован как область действия моего контейнера, поэтому ему нужен новый экземпляр для каждой области действия экземпляра саги, то есть аналогично экземпляру DbContext для каждого веб-запроса, если бы это было веб-приложение, но для саги masstransit в этом случае.

ОБНОВЛЕНИЕ: класс ContainerSagaDbContextFactory решил мою проблему.


person CraigM    schedule 24.04.2020    source источник


Ответы (1)


Вы не указали, какую версию MassTransit вы использовали, но после MassTransit 6.1 рекомендуется использовать метод AddDbContext в пакете интеграции контейнера (который должен быть MassTransit.StructureMap в вашем случае). Вы можете увидеть пример здесь: https://masstransit-project.com/usage/sagas/efcore.html#container-integration.

Фрагмент с этой веб-страницы:

services.AddMassTransit(cfg =>
{
    cfg.AddSagaStateMachine<OrderStateMachine, OrderState>()
        .EntityFrameworkRepository(r =>
        {
            r.ConcurrencyMode = ConcurrencyMode.Pessimistic; // or use Optimistic, which requires RowVersion

            r.AddDbContext<DbContext, OrderStateDbContext>((provider,builder) =>
            {
                builder.UseSqlServer(connectionString, m =>
                {
                    m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                    m.MigrationsHistoryTable($"__{nameof(OrderStateDbContext)}");
                });
            });
        });
});
person nizmow    schedule 24.04.2020
comment
Да, новая интеграция - лучший подход. В репозитории GitHub есть фабрика контекста, полностью содержащая все контейнеры. - person Chris Patterson; 24.04.2020
comment
Спасибо @Chris Patterson, я обнаружил, что вся фабрика контекста контейнера, о которой вы говорите, после просмотра кода masstransit. Сейчас работает как положено, большое спасибо - person CraigM; 25.04.2020