原創|使用教程|編輯:龔雪|2025-06-11 14:14:53.773|閱讀 80 次
概述:本文將為大家介紹DevExpress XAF將.NET Aspire集成到Blazor項目中后如何實現服務安排,歡迎下載最新版組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
DevExpress XAF是一款強大的現代應用程序框架,允許同時開發ASP.NET和WinForms。DevExpress XAF采用模塊化設計,開發人員可以選擇內建模塊,也可以自行創建,從而以更快的速度和比開發人員當前更強有力的方式創建應用程序。
.NET Aspire是一組工具、模板和包,用于構建可觀察的、可生產的應用程序。DevExpress XAF團隊花費了一些時間考慮Aspire的功能,試圖找到最好的集成點,讓XAF開發人員能夠利用Aspire開箱即用的業務流程特性。
DevExpress技術交流群11:749942875 歡迎一起進群討論
在最近的一篇文章中我們介紹了如何對一個 XAF Blazor 項目進行調整,來支持 .NET Aspire()。通過對啟動邏輯進行一些修改——包括標準的 XAF 項目模板和 Aspire 的 Visual Studio 向導生成的代碼,已經可以讓 XAF Blazor 項目作為 Aspire 編排體系的一部分運行了。但那只是最小規模的編排,只有一個模塊!接下來我們將會把部署方面的內容留到第三篇(敬請關注!),接下來得系列文章將介紹在示例項目中為實現以下三個場景所做的修改:
完整示例項目已托管在這個中。下面基于我在第一篇文章中描述的項目初始狀態,展開說明新的功能實現。
在上文中(),我們為大家介紹了如何將SQL Server添加為容器依賴項,本文將繼續介紹如何安排額外的應用程序服務,歡迎繼續關注我們~
到目前為止,業務流程有兩個部分:SQL Server和Blazor Server應用程序。現在,我將向應用程序系統添加一個額外的服務,它將從Blazor應用程序中的測試控制器調用。
首先創建一個新項目并將其添加到解決方案中,然后將對XafAspireDemo.ServiceDefaults的引用添加到新項目,并將對新項目的引用添加到項目XafAspireDemo.AppHost。
> dotnet new webapi -n XAFAspireDemo.DemoService > dotnet sln add XAFAspireDemo.DemoService/XAFAspireService.DemoService.csproj > dotnet add XAFAspireDemo.DemoService/XAFAspireService.DemoService.csproj reference XafAspireDemo.ServiceDefaults/XafAspireDemo.ServiceDefaults.csproj > dotnet add XafAspireDemo.AppHost reference XAFAspireDemo.DemoService/XAFAspireService.DemoService.csproj
在新的服務項目中添加了一個類Telemetry,類似于Blazor Server項目中的類,但是使用了它自己的標識符和名稱。
using System.Diagnostics; using System.Diagnostics.Metrics; namespace XafAspireDemo.DemoService { public class Telemetry : IDisposable { public ActivitySource ActivitySource { get; } public Meter Meter { get; } public string MeterName => Meter.Name; public Counter<long> ImportantBusinessValueRetrievalCounter { get; } public Histogram<double> ImportantBusinessValueRetrievalDuration { get; } public Telemetry(string serviceName = "XafAspireDemo.DemoService", string version = "1.0.0") { ActivitySource = new ActivitySource(serviceName, version); Meter = new Meter(serviceName, version); ImportantBusinessValueRetrievalCounter = Meter.CreateCounter<long>( "important_business_value.retrieval_count" ); ImportantBusinessValueRetrievalDuration = Meter.CreateHistogram<double>( "important_business_value.retrieval_duration" ); } public void Dispose() { ActivitySource.Dispose(); Meter.Dispose(); } } }
將XAFAspireDemo.DemoService/Program.cs中的模板代碼替換為:
using XafAspireDemo.DemoService; var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddOpenApi(); builder.Services.AddAspireServiceDefaults(); builder.Services.ConfigureOpenTelemetry(builder.Configuration, builder.Environment); var telemetry = new Telemetry(); builder.Services.AddSingleton(telemetry); builder .Services.AddOpenTelemetry() .WithTracing(tracing => tracing.AddSource("XafAspireDemo.DemoService")) .WithMetrics(metrics => { metrics.AddMeter(telemetry.MeterName); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseHttpsRedirection(); app.MapGet( "/important-business-value", (Telemetry telemetry) => { using var activity = telemetry.ActivitySource.StartActivity( "ImportantBusinessValueRetrieval" ); var importantBusinessValue = Random.Shared.Next(1, 10000); telemetry.ImportantBusinessValueRetrievalCounter.Add(1); if (activity != null) { activity.Stop(); var durationMs = activity.Duration.TotalMilliseconds; telemetry.ImportantBusinessValueRetrievalDuration.Record(durationMs); } return Results.Ok(new { ImportantBusinessValue = importantBusinessValue }); } ) .WithName("GetImportantBusinessValue") .WithOpenApi(); app.MapDefaultAspireDevEndpoints(); app.Run();
到目前為止,這些都是熟悉的代碼,只是需要指出一些細節:
現在修改文件XafAspireDemo.AppHost/Program.cs,將新項目添加到編排中。注意更改了對WithHttpsEndpoint的現有調用,來傳遞一個顯式名稱。Aspire不喜歡多個無參數調用,因為它不會分配自動生成的名稱。
... var db = sql.AddDatabase("XafAspireDemoDb"); --> var demoService = builder --> .AddProject<Projects.XAFAspireDemo_DemoService>("demoservice") --> .WithHttpsEndpoint(name: "demoservice-https"); builder .AddProject<Projects.XafAspireDemo_Blazor_Server>("xafaspiredemo-blazor-server") .WithEnvironment("ASPIRE_DEBUG", "true") --> .WithHttpsEndpoint(name: "xafaspiredemo-blazor-server-https") .WithReference(db) --> .WithReference(demoService) .WaitFor(db);
要從測試控制器調用新服務,需要為它提供一個HTTP客戶端,修改XafAspireDemo.Blazor.Server/Startup.cs并添加這一行:
... services.ConfigureOpenTelemetry(Configuration, WebHostEnvironment); --> services.AddHttpClient(); services.ConfigureOpenTelemetryTracerProvider(builder => ...
現在可以使用HTTP客戶端從XafAspireDemo.Blazor.Server/Controllers/ImportantBusinessOperationsController.cs中的控制器調用服務。
... { Thread.Sleep(new Random().Next(500, 5000)); }); --> var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>(); --> var httpClient = httpClientFactory.CreateClient(); --> var response = await httpClient.GetFromJsonAsync<ImportantBusinessValueResponse>( --> "http://demoservice/important-business-value" --> ); --> logger.LogInformation( --> "Received important business value from service: {ImportantBusinessValue}", --> response?.ImportantBusinessValue --> ); } catch (Exception ex) { ...
一個有趣的細節:服務請求的URL使用主機名demoservice。因為主機將服務配置為依賴項,Blazor服務器的DNS解析允許訪問該名稱并將其解析為目標服務。
這就完成了更改!當我現在運行應用程序時,Aspire Dashboard顯示了新的結構。日志輸出現在包括來自新服務的項目,度量也包括在內(選擇正確的資源來查看它們!),并且由于服務端點報告它自己的活動,現在您還可以在Traces頁面中看到嵌套的活動。
未完待續,我們下期再見!更多產品資訊及授權,歡迎來電咨詢:023-68661681
慧都是?家?業數字化解決?案公司,專注于軟件、?油與?業領域,以深?的業務理解和?業經驗,幫助企業實現智能化轉型與持續競爭優勢。
慧都科技是DevExpress的中國區的合作伙伴,DevExpress作為用戶界面領域的優秀產品,幫助企業高效構建權限管理、數據可視化(如網格/圖表/儀表盤)、跨平臺系統(WinForms/ASP.NET/.NET MAUI)及行業定制解決方案,加速開發并強化交互體驗。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網