StructureMap的ISagaDbContextFactory实现

问题描述 投票:0回答:1

是否有用于StructureMap的ISagaDbContextFactory的实现?我已经看到了Autofac的AutofacSagaDbContextFactory的实现,我将为StructureMap编写自己的实现,但是我不知道要获取nested容器实例的有效负载是什么期望大众运输会创造??我没有运气就尝试了以下方法

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已注册为我的容器的作用域,因此,每个saga实例作用域都需要一个新实例,即,如果它是一个Web应用程序,则类似于每个Web请求的DbContext实例,但在此实例中是masstransit saga。

UPDATE:ContainerSagaDbContextFactory类解决了我的问题。

entity-framework structuremap masstransit saga
1个回答
2
投票

[您没有指定要使用的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)}");
                });
            });
        });
});
© www.soinside.com 2019 - 2024. All rights reserved.