Реализация ISagaDbContextFactory для StructureMap - PullRequest
0 голосов
/ 24 апреля 2020

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

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 решил мою проблему.

1 Ответ

2 голосов
/ 24 апреля 2020

Вы не указали, какую версию 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)}");
                });
            });
        });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...