Excalibur.Data.ElasticSearch
3.0.0-alpha.33
dotnet add package Excalibur.Data.ElasticSearch --version 3.0.0-alpha.33
NuGet\Install-Package Excalibur.Data.ElasticSearch -Version 3.0.0-alpha.33
<PackageReference Include="Excalibur.Data.ElasticSearch" Version="3.0.0-alpha.33" />
<PackageVersion Include="Excalibur.Data.ElasticSearch" Version="3.0.0-alpha.33" />
<PackageReference Include="Excalibur.Data.ElasticSearch" />
paket add Excalibur.Data.ElasticSearch --version 3.0.0-alpha.33
#r "nuget: Excalibur.Data.ElasticSearch, 3.0.0-alpha.33"
#:package Excalibur.Data.ElasticSearch@3.0.0-alpha.33
#addin nuget:?package=Excalibur.Data.ElasticSearch&version=3.0.0-alpha.33&prerelease
#tool nuget:?package=Excalibur.Data.ElasticSearch&version=3.0.0-alpha.33&prerelease
Excalibur.Data.ElasticSearch
Elasticsearch data provider for the Excalibur framework, providing enterprise-grade document storage, full-text search, and projection management with comprehensive resilience, performance, and monitoring capabilities.
Overview
This package provides Elasticsearch integration for Excalibur applications, enabling:
- Document Storage: Type-safe repository pattern with CRUD operations
- Full-Text Search: Rich query DSL support with aggregations
- Index Management: Lifecycle management, templates, and schema evolution
- Projections: Event sourcing projection support with rebuild capabilities
- Resilience: Circuit breaker, retry policies, and dead letter handling
- Performance: Multi-level caching, connection pooling, and query optimization
- Monitoring: OpenTelemetry integration, metrics, and health checks
- Security: API key, certificate, and basic authentication
Installation
dotnet add package Excalibur.Data.ElasticSearch
Dependencies:
Elastic.Clients.Elasticsearch(8.x)Microsoft.Extensions.DependencyInjectionMicrosoft.Extensions.Options
Configuration
Basic Connection
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
// Single node
options.Url = new Uri("https://localhost:9200");
// Or multiple nodes
options.Urls = new[]
{
new Uri("https://node1:9200"),
new Uri("https://node2:9200"),
new Uri("https://node3:9200")
};
});
Elastic Cloud
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
options.CloudId = "my-deployment:dXMtY2VudHJhbDE...";
options.Connection.ApiKey = "your-api-key";
});
Authentication Options
API Key (Recommended)
options.Connection.ApiKey = "your-api-key";
// Or Base64-encoded
options.Connection.Base64ApiKey = "base64-encoded-api-key";
Basic Authentication
options.Connection.Username = "elastic";
options.Connection.Password = "your-password";
Certificate Fingerprint
options.Connection.CertificateFingerprint = "A1:B2:C3:...";
options.Connection.DisableCertificateValidation = false; // Keep false in production
Environment Variables
ELASTICSEARCH__URL=https://localhost:9200
ELASTICSEARCH__CONNECTION__APIKEY=your-api-key
ELASTICSEARCH__CONNECTION__USERNAME=elastic
ELASTICSEARCH__CONNECTION__PASSWORD=your-password
services.Configure<ElasticsearchConfigurationOptions>(
configuration.GetSection("Elasticsearch"));
Connection Settings
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
// Timeouts
options.Connection.RequestTimeout = TimeSpan.FromSeconds(30);
options.Connection.PingTimeout = TimeSpan.FromSeconds(5);
// Connection pooling
options.ConnectionPoolType = ConnectionPoolType.Sniffing;
options.Connection.MaximumConnectionsPerNode = 80;
// Node discovery
options.EnableSniffing = true;
options.Connection.SniffingInterval = TimeSpan.FromHours(1);
});
Index Management
Index Lifecycle Management
// Inject IIndexLifecycleManager
public class MyService
{
private readonly IIndexLifecycleManager _lifecycleManager;
public async Task ConfigureIndexAsync()
{
var policy = new IndexLifecyclePolicy
{
Hot = new HotPhaseConfiguration
{
RolloverConditions = new RolloverConditions
{
MaxAge = TimeSpan.FromDays(7),
MaxSize = "50gb"
}
},
Warm = new WarmPhaseConfiguration
{
MinAge = TimeSpan.FromDays(30)
},
Delete = new DeletePhaseConfiguration
{
MinAge = TimeSpan.FromDays(90)
}
};
await _lifecycleManager.CreatePolicyAsync("my-policy", policy);
}
}
Index Templates
// Inject IIndexTemplateManager
var template = new IndexTemplateConfiguration
{
Name = "my-template",
IndexPatterns = new[] { "logs-*" },
Priority = 100
};
await _templateManager.CreateTemplateAsync(template);
Projections
Projection Store
public class OrderProjection
{
public string OrderId { get; set; }
public string CustomerId { get; set; }
public decimal Total { get; set; }
public DateTime LastModified { get; set; }
}
// Configure projection store
services.AddElasticSearchProjectionStore<OrderProjection>(options =>
{
options.IndexPrefix = "orders";
});
Projection Rebuild
// Inject IProjectionRebuildManager
var request = new ProjectionRebuildRequest
{
ProjectionType = nameof(OrderProjection),
SourceIndexName = "orders-v1",
TargetIndexName = "orders-v2",
CreateNewIndex = true,
UseAliasing = true,
BatchSize = 1000
};
var result = await _rebuildManager.StartRebuildAsync(request);
// Check status
var status = await _rebuildManager.GetRebuildStatusAsync(result.OperationId);
Eventual Consistency Tracking
// Inject IEventualConsistencyTracker
var eventId = Guid.NewGuid().ToString();
await _tracker.TrackWriteModelEventAsync(eventId, "order-1", "OrderCreated", DateTime.UtcNow);
await _tracker.TrackReadModelProjectionAsync(eventId, nameof(OrderProjection), DateTime.UtcNow);
// Check lag
var lag = await _tracker.GetConsistencyLagAsync(nameof(OrderProjection));
if (!lag.IsWithinSLA)
{
_logger.LogWarning("Projection lagging by {Events} events", lag.PendingEvents);
}
Schema Evolution
// Inject ISchemaEvolutionHandler
var comparison = await _schemaHandler.CompareSchemaAsync("orders-v1", "orders-v2");
if (!comparison.IsBackwardsCompatible)
{
var migrationRequest = new SchemaMigrationRequest
{
ProjectionType = nameof(OrderProjection),
SourceIndex = "orders-v1",
TargetIndex = "orders-v2",
Strategy = MigrationStrategy.AliasSwitch,
NewSchema = new Elastic.Clients.Elasticsearch.Mapping.Properties
{
{ "orderId", new Elastic.Clients.Elasticsearch.Mapping.KeywordProperty() },
{ "status", new Elastic.Clients.Elasticsearch.Mapping.KeywordProperty() },
{ "total", new Elastic.Clients.Elasticsearch.Mapping.DoubleNumberProperty() }
}
};
var plan = await _schemaHandler.PlanMigrationAsync(migrationRequest);
await _schemaHandler.ExecuteMigrationAsync(plan);
}
Resilience
Circuit Breaker
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
options.Resilience.CircuitBreaker = new CircuitBreakerOptions
{
Enabled = true,
FailureThreshold = 5, // Open after 5 failures
MinimumThroughput = 10, // Minimum requests before evaluation
BreakDuration = TimeSpan.FromSeconds(30),
SamplingDuration = TimeSpan.FromSeconds(60),
FailureRateThreshold = 0.5 // 50% failure rate
};
});
Retry Policy
options.Resilience.Retry = new RetrySettings
{
MaxRetries = 3,
InitialDelay = TimeSpan.FromMilliseconds(100),
MaxDelay = TimeSpan.FromSeconds(30),
UseExponentialBackoff = true,
BackoffMultiplier = 2.0,
UseJitter = true
};
Dead Letter Handling
services.Configure<ElasticsearchDeadLetterOptions>(options =>
{
options.Enabled = true;
options.IndexName = "dead-letters";
options.RetentionDays = 30;
options.MaxRetries = 3;
});
Performance
Multi-Level Caching
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
options.Performance.Caching = new CachingSettings
{
L1 = new L1CacheSettings
{
Enabled = true,
MaxItems = 1000,
DefaultTtl = TimeSpan.FromMinutes(5)
},
L2 = new L2CacheSettings
{
Enabled = true,
MaxSize = 100_000_000, // 100MB
DefaultTtl = TimeSpan.FromMinutes(30)
},
L3 = new L3CacheSettings
{
Enabled = false,
CacheDirectory = "/tmp/es-cache"
}
};
});
Bulk Operations
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
options.Performance.BulkOperations = new BulkOperationSettings
{
MaxBatchSize = 1000,
MaxBatchBytes = 10_000_000, // 10MB
FlushInterval = TimeSpan.FromSeconds(5),
MaxConcurrentBatches = 4
};
});
Query Optimization
// IQueryOptimizer automatically optimizes queries
var optimized = await _queryOptimizer.OptimizeAsync(searchRequest);
var analysis = await _queryOptimizer.AnalyzeAsync(searchRequest);
Monitoring
OpenTelemetry Metrics
services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddMeter("Excalibur.Data.ElasticSearch");
})
.WithTracing(tracing =>
{
tracing.AddSource("Excalibur.Data.ElasticSearch");
});
Monitoring Settings
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
options.Monitoring = new ElasticsearchMonitoringOptions
{
Metrics = new MetricsOptions { Enabled = true },
RequestLogging = new RequestLoggingSettings
{
Enabled = true,
LogSlowQueries = true,
SlowQueryThreshold = TimeSpan.FromSeconds(1)
},
PerformanceDiagnostics = new PerformanceDiagnosticsSettings
{
Enabled = true,
SampleRate = 0.1 // 10% sampling
}
};
});
Health Checks
Registration
services.AddHealthChecks()
.AddElasticSearchHealthCheck(tags: new[] { "ready", "elasticsearch" });
Custom Configuration
services.AddHealthChecks()
.AddCheck<ElasticClientHealthCheck>(
"elasticsearch",
failureStatus: HealthStatus.Degraded,
tags: new[] { "ready" },
timeout: TimeSpan.FromSeconds(10));
Repository Pattern
Define Repository
public class OrderRepository : ElasticRepositoryBase<Order, string>
{
public OrderRepository(IElasticClient client) : base(client, "orders") { }
public async Task<IEnumerable<Order>> FindByCustomerAsync(string customerId)
{
return await SearchAsync(q => q
.Match(m => m.Field(f => f.CustomerId).Query(customerId)));
}
}
Register and Use
services.AddScoped<IOrderRepository, OrderRepository>();
// In your service
public class OrderService
{
private readonly IOrderRepository _orders;
public async Task<Order> GetAsync(string id)
{
return await _orders.GetByIdAsync(id);
}
}
Troubleshooting
Common Issues
Connection Refused
Elasticsearch.Net.ElasticsearchClientException: Connection refused
Solutions:
- Verify Elasticsearch is running
- Check URL and port configuration
- Verify firewall allows connections
- Check certificate fingerprint for HTTPS
Authentication Failed
Elasticsearch.Net.ElasticsearchClientException: 401 Unauthorized
Solutions:
- Verify API key or credentials
- Check user has required permissions
- Ensure authentication method matches server configuration
Index Not Found
Elasticsearch.Net.ElasticsearchClientException: index_not_found_exception
Solutions:
- Verify index exists:
GET /_cat/indices - Check index name spelling (case-sensitive)
- Create index if using auto-create
Logging Configuration
{
"Logging": {
"LogLevel": {
"Excalibur.Data.ElasticSearch": "Debug",
"Elastic.Transport": "Warning"
}
}
}
Complete Configuration Reference
services.Configure<ElasticsearchConfigurationOptions>(options =>
{
// Endpoint
options.Url = new Uri("https://localhost:9200");
options.CloudId = null;
options.ConnectionPoolType = ConnectionPoolType.Static;
options.EnableSniffing = false;
// Connection (authentication, timeouts, SSL/TLS)
options.Connection.Username = null;
options.Connection.Password = null;
options.Connection.ApiKey = "your-api-key";
options.Connection.CertificateFingerprint = null;
options.Connection.DisableCertificateValidation = false;
options.Connection.RequestTimeout = TimeSpan.FromSeconds(30);
options.Connection.PingTimeout = TimeSpan.FromSeconds(5);
options.Connection.MaximumConnectionsPerNode = 80;
options.Connection.SniffingInterval = TimeSpan.FromHours(1);
// Resilience
options.Resilience = new ElasticsearchResilienceOptions();
// Monitoring
options.Monitoring = new ElasticsearchMonitoringOptions();
// Projections
options.Projections = new ProjectionOptions();
});
See Also
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AWSSDK.Core (>= 4.0.3.8)
- AWSSDK.SecurityToken (>= 4.0.5.6)
- Azure.Identity (>= 1.17.1)
- Azure.Security.KeyVault.Keys (>= 4.8.0)
- Azure.Security.KeyVault.Secrets (>= 4.8.0)
- Ben.Demystifier (>= 0.4.1)
- BenchmarkDotNet (>= 0.15.4)
- CloudNative.CloudEvents (>= 2.8.0)
- CloudNative.CloudEvents.SystemTextJson (>= 2.8.0)
- Cronos (>= 0.11.1)
- Dapper (>= 2.1.66)
- Elastic.Clients.Elasticsearch (>= 8.15.0)
- Elastic.Transport (>= 0.4.22)
- Excalibur.Data (>= 3.0.0-alpha.33)
- Excalibur.Dispatch.Abstractions (>= 3.0.0-alpha.33)
- Excalibur.EventSourcing (>= 3.0.0-alpha.33)
- FluentValidation (>= 12.0.0)
- FluentValidation.DependencyInjectionExtensions (>= 12.0.0)
- IdentityModel (>= 7.0.0)
- JsonNet.ContractResolvers (>= 2.0.0)
- Medo.Uuid7 (>= 1.4.0)
- MemoryPack (>= 1.21.4)
- Microsoft.ApplicationInsights (>= 2.23.0)
- Microsoft.AspNetCore.Authorization (>= 9.0.9)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.Common (>= 4.14.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.14.0)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Configuration (>= 10.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.0)
- Microsoft.Extensions.Configuration.CommandLine (>= 10.0.0)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.0)
- Microsoft.Extensions.Configuration.Json (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Hosting (>= 10.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Logging.Console (>= 10.0.0)
- Microsoft.Extensions.ObjectPool (>= 10.0.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.0)
- Microsoft.IdentityModel.Tokens (>= 8.14.0)
- MongoDB.Driver (>= 2.25.0)
- NCrontab (>= 3.4.0)
- Npgsql (>= 9.0.4)
- OpenTelemetry (>= 1.13.0)
- OpenTelemetry.Api (>= 1.13.0)
- OpenTelemetry.Extensions.Hosting (>= 1.13.0)
- Polly (>= 8.6.4)
- QuestPDF (>= 2024.12.2)
- Snappier (>= 1.2.0)
- System.IdentityModel.Tokens.Jwt (>= 8.14.0)
- System.Threading.RateLimiting (>= 10.0.0)
-
net8.0
- AWSSDK.Core (>= 4.0.3.8)
- AWSSDK.SecurityToken (>= 4.0.5.6)
- Azure.Identity (>= 1.17.1)
- Azure.Security.KeyVault.Keys (>= 4.8.0)
- Azure.Security.KeyVault.Secrets (>= 4.8.0)
- Ben.Demystifier (>= 0.4.1)
- BenchmarkDotNet (>= 0.15.4)
- CloudNative.CloudEvents (>= 2.8.0)
- CloudNative.CloudEvents.SystemTextJson (>= 2.8.0)
- Cronos (>= 0.11.1)
- Dapper (>= 2.1.66)
- Elastic.Clients.Elasticsearch (>= 8.15.0)
- Elastic.Transport (>= 0.4.22)
- Excalibur.Data (>= 3.0.0-alpha.33)
- Excalibur.Dispatch.Abstractions (>= 3.0.0-alpha.33)
- Excalibur.EventSourcing (>= 3.0.0-alpha.33)
- FluentValidation (>= 12.0.0)
- FluentValidation.DependencyInjectionExtensions (>= 12.0.0)
- IdentityModel (>= 7.0.0)
- JsonNet.ContractResolvers (>= 2.0.0)
- Medo.Uuid7 (>= 1.4.0)
- MemoryPack (>= 1.21.4)
- Microsoft.ApplicationInsights (>= 2.23.0)
- Microsoft.AspNetCore.Authorization (>= 9.0.9)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.Common (>= 4.14.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.14.0)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Configuration (>= 10.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.0)
- Microsoft.Extensions.Configuration.CommandLine (>= 10.0.0)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.0)
- Microsoft.Extensions.Configuration.Json (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Hosting (>= 10.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Logging.Console (>= 10.0.0)
- Microsoft.Extensions.ObjectPool (>= 10.0.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.0)
- Microsoft.IdentityModel.Tokens (>= 8.14.0)
- MongoDB.Driver (>= 2.25.0)
- NCrontab (>= 3.4.0)
- Npgsql (>= 9.0.4)
- OpenTelemetry (>= 1.13.0)
- OpenTelemetry.Api (>= 1.13.0)
- OpenTelemetry.Extensions.Hosting (>= 1.13.0)
- Polly (>= 8.6.4)
- QuestPDF (>= 2024.12.2)
- Snappier (>= 1.2.0)
- System.Collections.Immutable (>= 10.0.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.0)
- System.IdentityModel.Tokens.Jwt (>= 8.14.0)
- System.IO.Pipelines (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
- System.Threading.Channels (>= 10.0.0)
- System.Threading.RateLimiting (>= 10.0.0)
-
net9.0
- AWSSDK.Core (>= 4.0.3.8)
- AWSSDK.SecurityToken (>= 4.0.5.6)
- Azure.Identity (>= 1.17.1)
- Azure.Security.KeyVault.Keys (>= 4.8.0)
- Azure.Security.KeyVault.Secrets (>= 4.8.0)
- Ben.Demystifier (>= 0.4.1)
- BenchmarkDotNet (>= 0.15.4)
- CloudNative.CloudEvents (>= 2.8.0)
- CloudNative.CloudEvents.SystemTextJson (>= 2.8.0)
- Cronos (>= 0.11.1)
- Dapper (>= 2.1.66)
- Elastic.Clients.Elasticsearch (>= 8.15.0)
- Elastic.Transport (>= 0.4.22)
- Excalibur.Data (>= 3.0.0-alpha.33)
- Excalibur.Dispatch.Abstractions (>= 3.0.0-alpha.33)
- Excalibur.EventSourcing (>= 3.0.0-alpha.33)
- FluentValidation (>= 12.0.0)
- FluentValidation.DependencyInjectionExtensions (>= 12.0.0)
- IdentityModel (>= 7.0.0)
- JsonNet.ContractResolvers (>= 2.0.0)
- Medo.Uuid7 (>= 1.4.0)
- MemoryPack (>= 1.21.4)
- Microsoft.ApplicationInsights (>= 2.23.0)
- Microsoft.AspNetCore.Authorization (>= 9.0.9)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.Common (>= 4.14.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.14.0)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Configuration (>= 10.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.0)
- Microsoft.Extensions.Configuration.CommandLine (>= 10.0.0)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.0)
- Microsoft.Extensions.Configuration.Json (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Hosting (>= 10.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Logging (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Logging.Console (>= 10.0.0)
- Microsoft.Extensions.ObjectPool (>= 10.0.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.0)
- Microsoft.IdentityModel.Tokens (>= 8.14.0)
- MongoDB.Driver (>= 2.25.0)
- NCrontab (>= 3.4.0)
- Npgsql (>= 9.0.4)
- OpenTelemetry (>= 1.13.0)
- OpenTelemetry.Api (>= 1.13.0)
- OpenTelemetry.Extensions.Hosting (>= 1.13.0)
- Polly (>= 8.6.4)
- QuestPDF (>= 2024.12.2)
- Snappier (>= 1.2.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.0)
- System.IdentityModel.Tokens.Jwt (>= 8.14.0)
- System.IO.Pipelines (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
- System.Threading.Channels (>= 10.0.0)
- System.Threading.RateLimiting (>= 10.0.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Excalibur.Data.ElasticSearch:
| Package | Downloads |
|---|---|
|
Excalibur.Inbox.ElasticSearch
Elasticsearch implementation of the inbox pattern for Excalibur, providing idempotent message processing. |
|
|
Excalibur.Outbox.ElasticSearch
Elasticsearch implementation of the outbox pattern for Excalibur. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.0.0-alpha.33 | 21 | 3/15/2026 |
| 3.0.0-alpha.31 | 28 | 3/15/2026 |
| 3.0.0-alpha.26 | 37 | 3/5/2026 |
| 3.0.0-alpha.19 | 43 | 2/26/2026 |