/Документация

ASP.NET Core


Регистрация

Вызовите AddEnma() в Program.cs:

builder.Services.AddEnma(o =>
{
    o.ApiToken       = builder.Configuration["Enma:ApiToken"]!;
    o.OrganizationId = Guid.Parse(builder.Configuration["Enma:OrgId"]!);
    o.ProjectId      = Guid.Parse(builder.Configuration["Enma:ProjectId"]!);
    o.SdkClientId    = Guid.Parse(builder.Configuration["Enma:SdkClientId"]!);
});

AddEnma() регистрирует:

  • IEnmaClient как singleton
  • IHostedService для корректного завершения (отправка оставшихся событий при остановке хоста)

Привязка через IConfiguration

Вместо инлайн-конфигурации можно привязать секцию целиком:

// appsettings.json
{
  "Enma": {
    "ApiToken": "sdk_...",
    "OrganizationId": "...",
    "ProjectId": "...",
    "SdkClientId": "...",
    "BatchSize": 100,
    "MaxRetries": 5
  }
}
builder.Services.AddEnma(builder.Configuration.GetSection("Enma"));

Использование через DI

Внедряйте IEnmaClient в контроллеры, сервисы или middleware:

public class OrdersController : ControllerBase
{
    private readonly IEnmaClient _enma;

    public OrdersController(IEnmaClient enma) => _enma = enma;

    [HttpPost]
    public IActionResult CreateOrder(CreateOrderRequest request)
    {
        _enma.Track("order.created", e =>
        {
            e.Actor.UserId = User.FindFirst("sub")?.Value;
            e.Payload = new { request.ProductId, request.Quantity };
        });

        return Ok();
    }
}

Корректное завершение

При использовании AddEnma() все буферизованные события автоматически отправляются при остановке хоста через IHostedService. Вызывать FlushAsync() вручную не нужно.

Пример с middleware и тегами

builder.Services.AddEnma(o =>
{
    o.ApiToken       = "sdk_...";
    o.OrganizationId = Guid.Parse("...");
    o.ProjectId      = Guid.Parse("...");
    o.SdkClientId    = Guid.Parse("...");

    // Глобальные теги
    o.DefaultTags["service"] = "order-api";
    o.DefaultTags["env"]     = builder.Environment.EnvironmentName;

    // Middleware — добавляем имя хоста
    o.Use(next => async (evt, ct) =>
    {
        evt.Tags ??= new Dictionary<string, string>();
        evt.Tags["host"] = Environment.MachineName;
        await next(evt, ct);
    });
});