Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как подключить MassTransit к Postgre через Dapper для хранения саг?

Руслан Сафин Знаток (423), на голосовании 7 месяцев назад
Нигде не могу найти рабочего примера, а в доках к MassTransit пример под MSSQL (у него в зависимостях SqlClient и не читает строку подключения для Postgre). Или это возможно только через EFCore + Npgsql?
Дополнен 8 месяцев назад
Увы, приведенные ответы не являются рабочими.
Как мне объяснили на StackOverflow ( https://stackoverflow.com/questions/77940065/how-do-i-connect-masstransit-to-postgres-via-dapper-to-store-sagas ) в MassTransit под капотом для Dapper создана жесткая привязка к SqlClient (MS SQL). Поэтому единственным способом подключить MassTransit к Postgre это использование EFCore.
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) 8 месяцев назад
нагугленный пример

 using System; 
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using Dapper;
using MassTransit;
using MassTransit.EntityFrameworkIntegration;
using MassTransit.Saga;
using Npgsql;

public class YourSagaInstance : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string CurrentState { get; set; }
// Добавьте дополнительные свойства саги
}

public class YourSaga : MassTransitStateMachine
{
// Определите состояния и действия для вашей саги
}

public class YourSagaRepository : ISagaRepository
{
private readonly IDbConnection _connection;

public YourSagaRepository(string connectionString)
{
_connection = new NpgsqlConnection(connectionString);
}

public async Task> Find(Guid correlationId)
{
var sql = "SELECT CorrelationId FROM YourSagaInstance WHERE CorrelationId = @correlationId";
return await _connection.QueryAsync(sql, new { correlationId });
}

// Реализуйте остальные методы ISagaRepository
}

class Program
{
static async Task Main(string[] args)
{
var repository = new YourSagaRepository("YourPostgreConnectionString");

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost"), h => { /* конфигурация хоста */ });

cfg.UseSerilog();
cfg.UseMessageRetry(r => r.Interval(3, 100));

cfg.ReceiveEndpoint(host, "your_queue", e =>
{
e.PrefetchCount = 16;
e.StateMachineSaga(new YourSaga(), repository);
});
});
}
}
발렌티나 빅토로브나 토포리셰바 Просветленный (41039) 8 месяцев назад
Да, подключение MassTransit к PostgreSQL через Dapper для хранения саг возможно. Вот пример, как это сделать:

1. Установите необходимые пакеты NuGet:
- MassTransit
- Npgsql
- Dapper

2. Создайте класс `SagaState` для представления состояния саги:
```csharp
public class SagaState
{
public Guid CorrelationId { get; set; }
public string SomeData { get; set; }
// Добавьте другие свойства, необходимые для представления состояния саги
}
```

3. Создайте класс `SagaStateMachine` для определения стейт-машины саги:
```csharp
public class SagaStateMachine : MassTransitStateMachine<SagaState>
{
public SagaStateMachine()
{
// Определите состояния и переходы вашей стейт-машины
}
}
```

4. В методе `ConfigureServices` вашего `Startup.cs` добавьте следующий код для настройки подключения к Postgre через Dapper:
```csharp
services.AddSingleton(provider =>
{
var connectionString = Configuration.GetConnectionString("PostgreConnectionString");
return new NpgsqlConnection(connectionString);
});
services.AddScoped(provider =>
{
var connection = provider.GetService<NpgsqlConnection>();
return new QueryConnectionFactory(connection);
});
services.AddScoped<IDatabaseContext>(provider =>
{
var connectionFactory = provider.GetService<QueryConnectionFactory>();
return new DatabaseContext(connectionFactory, transaction);
});
```

Важно передать строку подключения `PostgreConnectionString` из вашего `appsettings.json`.

5. Настройте MassTransit и удалите дефолтную зависимость на SqlServer. Добавьте следующий код в `ConfigureServices`:
```csharp
services.AddMassTransit(x =>
{
x.UsingRabbitMq((context, cfg) =>
{
// Настройки эндпоинта и шины сообщений
});
x.AddSagaStateMachine<SagaStateMachine, SagaState>()
.DapperRepository(r => r.ConstructUsing(() => new PostgresSagaRepository<SagaState>(provider.GetService<IDatabaseContext>())))
});
```

6. Обновите строку подключения в `appsettings.json`:
```json
"PostgreConnectionString": "Host=myhost;Port=myport;Username=myuser;Password=mypassword;Database=mydatabase"
```

Теперь вы должны быть в состоянии подключить MassTransit к Postgre через Dapper для хранения саг.

Важно отметить, что этот пример использует `PostgresSagaRepository<TSaga>` из пакета `MassTransit.PostgresIntegration`, который добавляет поддержку Postgre для MassTransit.
Похожие вопросы