当前位置: 首页 > news >正文

界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现数据库依赖?

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。

.NET Aspire是一组工具、模板和包,用于构建可观察的、可生产的应用程序。DevExpress XAF团队花费了一些时间考虑Aspire的功能,试图找到最好的集成点,让XAF开发人员能够利用Aspire开箱即用的业务流程特性。

点击获取DevExpress最新版下载

在最近的一篇文章中我们介绍了如何对一个 XAF Blazor 项目进行调整,来支持 .NET Aspire(点击这里回顾>>)。通过对启动逻辑进行一些修改——包括标准的 XAF 项目模板和 Aspire 的 Visual Studio 向导生成的代码,已经可以让 XAF Blazor 项目作为 Aspire 编排体系的一部分运行了。但那只是最小规模的编排,只有一个模块!接下来我们将会把部署方面的内容留到第三篇(敬请关注!),接下来得系列文章将介绍在示例项目中为实现以下三个场景所做的修改:

  1. 通过 OpenTelemetry 将自定义活动和指标记录到 Aspire 仪表盘
  2. 将 SQL Server 作为一个由 Aspire 协调运行的容器化依赖项
  3. 在编排中添加一个额外的服务,展示更复杂的系统结构

完整示例项目已托管在这个 GitHub 仓库中。下面基于我在第一篇文章中描述的项目初始状态,展开说明新的功能实现。

在上文中(点击这里回顾>>),我们为大家介绍了如何利用 OpenTelemetry 支持自定义指标与活动日志,本文将继续介绍如何将SQL Server添加为容器依赖项,欢迎继续关注我们~

将SQL Server添加为容器依赖项

Aspire最大的优点之一是它可以为您处理应用程序系统的基础设施依赖关系。现在有许多NuGet包,通常以Aspire.Hosting.开头命名,它提供了与特定体系结构组件接口的封装器。其中一个这样的组件是SQL Server,Aspire.Hosting.SqlServer包使其可用。

注意,NuGet包引用需要添加到项目XafAspire.AppHost中,因为SQL Server实例将在这里配置。

第二个注意事项:要将容器作为Aspire业务流程的一部分运行,您需要安装容器运行时。如果您需要这一步的帮助,请查看这个 Microsoft 文档页面。

要声明业务流程需要一个SQL Server组件,并且它是Blazor服务器进程的依赖,您只需要在文件XafAspireDemo.AppHost/Program.cs中添加几行代码:

var builder = DistributedApplication.CreateBuilder(args);--> var sql = builder.AddSqlServer("sql")
--> .WithLifetime(ContainerLifetime.Persistent);--> var db = sql.AddDatabase("XafAspireDemoDb");builder
.AddProject<Projects.XafAspireDemo_Blazor_Server>("xafaspiredemo-blazor-server")
.WithHttpsEndpoint()
--> .WithReference(db)
--> .WaitFor(db);builder.Build().Run();

首先,对AddSqlServer的调用为您的应用程序系统建立业务流程的组件。调用WithLifetime(ContainerLifetime.Persistent)在开发中通常很有用,因为容器将随着应用程序系统的每次运行而启动和停止,这将导致任何测试数据的丢失。使用Persistent参数,当应用程序系统的其余部分停止时,容器仍在运行,这加快了下一次运行的速度并保留了数据。

演示数据库的数据库引用被传递给Blazor Server项目,WaitFor调用确保在Blazor Server应用程序尝试访问数据库之前,数据库已准备好进行操作。

这种与SQL Server一起工作的方法不需要您了解任何关于连接字符串和其他特定细节,这是非常方便的!

当然,我们现在需要弄清楚Blazor服务器应用程序是如何连接到新的依赖项的。Aspire有一些自动处理,可以发现如何与SQL Server的容器联系,并且在环境变量中自动提供连接字符串。该变量的名称的构造类似于重载配置文件内容的环境变量,并且它在设置中合并了数据库的名称。对于上面的代码,环境变量名是ConnectionStrings__XafAspireDemoDb。

通过在当前点运行应用程序,记住到新容器化数据库的连接尚未被使用,您可以看到SQL Server容器已经启动(例如在Docker Desktop中),并且仪表板正确显示了新的依赖项,带有连接字符串的环境变量也可以在仪表板中看到。

QtitanChart助力能源行业智能决策——石油、电力等场景中的可视化实践

QtitanChart助力能源行业智能决策——石油、电力等场景中的可视化实践

连接字符串包括一个本地端口号,由Aspire提供的代理服务提供,数据库用户sa的密码由Aspire适配器自动生成。

QtitanChart助力能源行业智能决策——石油、电力等场景中的可视化实践

现在缺少一个允许Blazor Server应用程序使用容器化SQL Server的更改,编辑文件XafAspireDemo.Blazor.Server/Startup.cs,并在ConfigureServices方法中找到分配connectionString的块。在默认的XAF模板中,代码通过调用Configuration.GetConnectionString加载连接字符串,将此代码替换为对环境变量的简单求值:

//options.UseInMemoryDatabase("InMemory");// The environment variable is published by the Aspire Host
--> string connectionString =
--> Environment.GetEnvironmentVariable("ConnectionStrings__XafAspireDemoDb");#if EASYTEST
if (
Configuration.GetConnectionString("EasyTestConnectionString")

现在您可以再次运行应用程序,容器中的SQL Server将被使用,替代之前使用的任何其他实例。

再多一点……

将项目设置为使用基础设施容器的一个重要细节是,其他开发人员可以轻松地在他们的机器上执行项目,而无需准备环境。例如,此时我能够在自己的Mac上运行完整的演示解决方案!在这方面,我想提两个细节。

首先,我只是在Mac上使用dotnet run --project XafAspireDemo.AppHost,当试图在仪表板中执行任何操作时,就会出现大量的警告和错误。事实证明,发生这种情况是因为没有明确信任.NET生成的开发时HTTPS证书。这通常不是什么大问题,它只是偶尔会导致警告,但Aspire Dashboard似乎在更大程度上依赖于这些证书来进行gRPC连接。

您可以在微软文档中阅读有关在ASP.NET Core中使用HTTPS的所有内容,简单的命令dotnet dev-certs https --trust可以建立必要的信任,并消除gRPC连接问题。

其次,在没有附加调试器的情况下运行时,XAF的标准操作在自动数据库模式更新和更新程序执行方面发生了变化。在生产部署中,您可以按照这里的XAF文档中的描述来处理这个问题,但是出于开发目的,我决定扩展自动更新机制,以涵盖正在使用的Aspire场景。

我们编辑了文件XafAspireDemo.Blazor.Server/BlazorApplication.cs,其中包含一行,用于检查环境是否有附加的调试器—如果找到了,则执行自动更新。我们拓展了这一行,来接受一个环境变量作为替代:

--> if(Environment.GetEnvironmentVariable("ASPIRE_DEBUG") != null || System.Diagnostics.Debugger.IsAttached) {
e.Updater.Update();
e.Handled = true;
}现在修改了XafAspireDemo.AppHost/Program.cs中的Aspire主机启动逻辑,以便在启动时设置这个变量:builder
.AddProject<Projects.XafAspireDemo_Blazor_Server>("xafaspiredemo-blazor-server")
--> .WithEnvironment("ASPIRE_DEBUG", "true")
.WithHttpsEndpoint()
.WithReference(db)
.WaitFor(db);

有了这些改变,演示解决方案现在可以在Mac上完美运行了!

相关文章:

  • NoSQL之redis哨兵
  • 洞悉 MySQL 查询性能:EXPLAIN 命令 type 字段详解
  • 【各种主流消息队列(MQ)对比指南】
  • MySQL 事务详解
  • 优选算法第十二讲:队列 + 宽搜 优先级队列
  • 2025年多层PCB技术发展与厂商实践指南
  • 基于深度学习的无人机轨迹预测
  • 嵌入式学习笔记 - FreeRTOS 信号量以及释放函数
  • N2语法 列挙、話題提出
  • 构建 MCP 服务器:第 3 部分 — 添加提示
  • AWS API Gateway配置日志
  • 第16届蓝桥杯青少Scratch 4月stema——飞翔的小燕子
  • Linux中shell编程表达式和数组讲解
  • 使用UDP连接ssh
  • [论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
  • IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
  • 轻松备份和恢复 Android 系统 | 4 种解决方案
  • uniapp 设置手机不息屏
  • uni-app 如何实现选择和上传非图像、视频文件?
  • 实践指南:从零开始搭建RAG驱动的智能问答系统
  • vps如何做网站步骤/国内网络营销公司排名
  • 深圳网站制作工作室/免费加精准客源
  • 网站建设价格a去找真甲先生/百度首页纯净版怎么设置
  • 云南做网站报价/国际军事新闻最新消息
  • 日照建设工程信息网站/国际军事新闻最新消息今天
  • 网站专题页是什么/网址大全实用网址