Aspire 社区工具包与 RavenDB 集成

包含:托管集成已包含 - Client 集成已包含Client 集成

注释

此集成是社区工具包的Aspire一部分,不受团队正式支持Aspire。

RavenDB 是一种高性能开源 NoSQL 数据库,专为快速、高效且可缩放的数据存储而设计。 它支持 ACID 事务、分布式数据复制和时序数据管理等高级功能,使其成为新式应用程序开发的极佳选择。 Aspire RavenDB 集成使你能够连接到现有的 RavenDB 实例,或使用 .NET创建新实例

托管集成

托管集成的 RavenDB 将服务器建模为 RavenDBServerResource 类型,并将数据库建模为类型 RavenDBDatabaseResource 。 若要访问这些类型和 API,请添加 📦 CommunityToolkit。Aspire。AppHost 项目中的 Hosting.RavenDB NuGet 包。

dotnet add package CommunityToolkit.Aspire.Hosting.RavenDB

有关详细信息,请参阅 dotnet 添加包管理 .NET 应用程序中的包依赖性

添加 RavenDB 服务器资源和数据库资源

若要在 AppHost 项目中设置 RavenDB,请在实例上AddRavenDB调用其中builder一种扩展方法以添加 RavenDB 服务器资源,然后在服务器资源上调用AddDatabase以添加数据库。 下面是一个示例:

var builder = DistributedApplication.CreateBuilder(args);

var ravenServer = builder.AddRavenDB("ravenServer");
var ravendb = ravenServer.AddDatabase("ravendb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(ravendb)
       .WaitFor(ravendb);

// After adding all resources, build and run the app...

重要

需要有效的 RavenDB 许可证。 如果还没有社区许可证,可以 在此处请求免费社区许可证。

将 Aspire 容器映像添加到 AppHost 时,如前面的示例 docker.io/ravendb/ravendb 所示,它会在您的本地计算机上创建一个新的 RavenDB 实例。 将对 RavenDB 数据库资源(变量ravendb)的引用添加到ExampleProject中。

有关详细信息,请参阅 容器资源生命周期

在数据卷上添加 RavenDB 服务器资源

若要向 RavenDB 服务器资源添加数据卷,请在 RavenDB 服务器资源上调用 Aspire.Hosting.RavenDBBuilderExtensions.WithDataVolume 该方法:

var builder = DistributedApplication.CreateBuilder(args);

var ravenServer = builder.AddRavenDB("ravenServer")
                         .WithDataVolume();

builder.AddProject<Projects.ExampleProject>()
       .WithReference(ravenServer)
       .WaitFor(ravenServer);

容器生命周期结束后,数据卷仍可用,从而保留 RavenDB 数据。 数据卷装载在 RavenDB 容器中的 /var/lib/ravendb/data 路径上,如果未提供 name 参数,则会随机生成名称。 有关数据量的详细信息,以及它们为何优于 绑定装载的详细原因,请参阅 Docker 文档:数据量

添加具备数据绑定挂载功能的 RavenDB 服务器资源

若要添加数据绑定挂载到 RavenDB 服务器资源,请调用方法 Aspire.Hosting.RavenDBBuilderExtensions.WithDataBindMount

var builder = DistributedApplication.CreateBuilder(args);

var ravenServer = builder.AddRavenDB("ravenServer")
                         .WithDataBindMount(source: @"C:\RavenDb\Data");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(ravenServer)
       .WaitFor(ravenServer);

重要

相比,绑定 装载的数据功能有限,而 提供更好的性能、可移植性和安全性,因此它们更适用于生产环境。 但是,绑定装载允许直接访问和修改主机系统上的文件,非常适合在需要实时更改的情况下进行开发和测试。

数据绑定挂载依赖于主机机器的文件系统,以在容器重启时持久化 RavenDB 数据。 数据绑定挂载在主机上的 Windows(或 C:\RavenDb\Data 上的 /RavenDB/Data)路径中的 RavenDB 容器中的 Unix。 有关数据绑定挂载的详细信息,请参阅 Docker 文档:数据绑定挂载

添加受保护的 RavenDB 服务器资源

若要使用预配置的 settings.json 文件或自签名证书中的设置创建新的安全 RavenDB 实例,请使用 RavenDBServerSettings.Secured 该方法或 RavenDBServerSettings.SecuredWithLetsEncrypt “让我们加密”配置。 这些方法允许你指定域 URL、证书详细信息和其他服务器设置。 下面是如何使用 Let's Encrypt 添加受保护的 RavenDB 服务器资源的示例:

var builder = DistributedApplication.CreateBuilder(args);

var serverSettings = RavenDBServerSettings.SecuredWithLetsEncrypt(
    domainUrl: "https://mycontainer.development.run",
    certificatePath: "/etc/ravendb/security/cluster.server.certificate.mycontainer.pfx");

var ravendb = builder.AddRavenDB("ravenSecuredServer", serverSettings)
    .WithBindMount("C:/RavenDB/Server/Security", "/etc/ravendb/security", false)
    .AddDatabase("ravendbSecured");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(ravendb)
       .WaitFor(ravendb);

重要

通过将证书路径绑定到 /etc/ravendb/security,确保容器可以访问该证书路径。

主办集成健康检查

RavenDB 托管集成会自动为 RavenDB 服务器资源添加运行状况检查,验证服务器是否正在运行并可访问。

托管集成依赖于 📦 AspNetCore.HealthChecks.RavenDB NuGet 包。

Client 集成

若要开始使用 Aspire RavenDB 客户端集成,请在依赖于 RavenDB 客户端的项目中安装 📦 CommunityToolkit.Aspire.RavenDB.Client NuGet 包,该项目即是使用 RavenDB 客户端的应用程序的项目。 RavenDB 客户端集成注册 IDocumentStore 实例,该实例充当与 RavenDB 服务器资源或现有 RavenDB 实例交互的入口点。 如果 AppHost 包含 RavenDB 数据库资源,则关联的 IDocumentSessionIAsyncDocumentSession 实例也注册为依赖项注入。

dotnet add package CommunityToolkit.Aspire.RavenDB.Client

添加 RavenDB 客户端

在您的客户端消费项目中的 Program.cs 文件中,对任何 Microsoft.Extensions.Hosting.RavenDBClientExtension.AddRavenDBClient 调用 IHostApplicationBuilder 扩展方法,以注册 IDocumentStore,以便通过依赖注入容器进行使用。 该方法采用连接名称参数。

builder.AddRavenDBClient(connectionName: "ravendb");

小窍门

参数 connectionName 必须与在 AppHost 项目中添加 RavenDB 服务器资源(或数据库资源(如果提供)时使用的名称匹配。 换句话说,调用 AddDatabase 并提供同一名称 ravendb时,应在调用 AddRavenDBClient时使用同一名称。 有关详细信息,请参阅 添加 RavenDB 服务器资源和数据库资源

然后,可以使用依赖项注入检索 IDocumentStore 实例。 例如,若要从示例服务检索客户端:

public class ExampleService(IDocumentStore client)
{
    // Use client...
}

使用 RavenDBClientSettings 添加 RavenDB 客户端

AddRavenDBClient 方法提供接受 RavenDBClientSettings 对象的重载。 这样,就可以独立于托管集成使用客户端集成。 该 RavenDBClientSettings 类包含建立连接所需的参数。 有关可用配置选项的更多详细信息,请参阅下面的 “配置选项” 部分。

下面是一个示例:

var settings = new RavenDBClientSettings
{
    Urls = new[] { serverUrl },
    DatabaseName =  myDatabaseName,
    Certificate = myCertificate
};

builder.AddRavenDBClient(settings: settings);

注释

这些方法非常适合连接到现有 RavenDB 实例,而无需依赖于托管集成。 如果已运行独立实例(例如在云中),并且想要使用其特定详细信息连接到它,则此方法特别有用。

注册后,您可以按如下所示检索IDocumentStore实例及其关联的IDocumentSession实例和IAsyncDocumentSession实例:

var documentStore = host.Services.GetRequiredService<IDocumentStore>();
var session = host.Services.GetRequiredService<IDocumentSession>();
var asyncSession = host.Services.GetRequiredService<IAsyncDocumentSession>();

添加密钥 RavenDB 客户端

如果应用程序需要具有不同连接配置的多个 IDocumentStore 实例,则可以使用 Microsoft.Extensions.Hosting.RavenDBClientExtension.AddKeyedRavenDBClient 扩展方法注册键式 RavenDB 客户端:

builder.AddKeyedRavenDBClient(serviceKey: "production", connectionName: "production");
builder.AddKeyedRavenDBClient(serviceKey: "testing", connectionName: "testing");

然后,可以使用依赖项注入检索 IDocumentStore 实例。 例如,若要从示例服务检索连接,

public class ExampleService(
    [FromKeyedServices("production")] IDocumentStore production,
    [FromKeyedServices("testing")] IDocumentStore testing)
{
    // Use databases...
}

有关密钥服务的详细信息,请参阅 .NET 依赖关系注入:密钥服务

配置

Aspire RavenDB Client 集成提供了多种配置方法和选项,以满足项目的要求和约定。

使用连接字符串

使用配置部分中的连接字符串 ConnectionStrings 时,在调用 builder.AddRavenDBClient时提供连接字符串的名称:

builder.AddRavenDBClient("ravendb");

将从配置部分检索 ConnectionStrings 连接字符串:

{
  "ConnectionStrings": {
    "ravendb": "Url=http://localhost:8080/;Database=ravendb"
  }
}

使用配置提供器

Aspire RavenDB 集成支持 Microsoft.Extensions.Configuration。 它使用RavenDBClientSettings键从配置中加载Aspire:RavenDB:Client。 请考虑以下示例 appsettings.json 用于配置某些选项:

{
  "Aspire": {
    "RavenDB": {
      "Client": {
        "ConnectionString": "URL=http://localhost:8080;Database=ravendb",
        "DisableHealthChecks": false,
        "HealthCheckTimeout": 10000,
        "DisableTracing": false
      }
    }
  }
}

使用内联配置

还可以传递 Action<RavenDBClientSettings> 代理来设置内联选项中的部分或全部。

builder.AddRavenDBClient(connectionName: "ravendb", configureSettings: 
    settings => 
    {
        settings.CreateDatabase = true;
        settings.Certificate = myCertificate;
        settings.DisableTracing = true;
    }

配置选项

Aspire RavenDB 客户端集成通过RavenDBClientSettings类提供灵活的配置选项,使你能够定制与项目要求的连接。 以下是关键属性:

名称 DESCRIPTION
Urls RavenDB 群集的连接 URL(string[])。
DatabaseName 可选。 要创建或连接到的 RavenDB 数据库的名称。
CertificatePath 可选。 安全 RavenDB 实例的证书路径位置。
CertificatePassword 可选。 证书的密码(如果需要)。
Certificate 可选。 X509Certificate2安全 RavenDB 实例的实例。
CreateDatabase 一个布尔值,该值指示是否应创建新数据库(如果它尚不存在)。
ModifyDocumentStore 可选。 用Action来修改IDocumentStore实例。
DisableHealthChecks 一个布尔值,该值指示是否禁用数据库运行状况检查。
HealthCheckTimeout 一个 int? 值,指示 RavenDB 运行状况检查超时(以毫秒为单位)。
DisableTracing 一个布尔值,用于指示 OpenTelemetry 跟踪是否被禁用。

Client 集成健康检查

Aspire RavenDB 客户端集成使用配置的客户端来执行 IsHealthyAsync。 如果结果是 true,则健康检查被视为健康,否则视为不健康。 同样,如果存在异常,则健康检查被视为不正常,错误会通过健康检查的失败进行传播。

另请参阅