原創(chuàng)|使用教程|編輯:龔雪|2025-06-11 14:14:53.773|閱讀 80 次
概述:本文將為大家介紹DevExpress XAF將.NET Aspire集成到Blazor項目中后如何實現(xiàn)服務(wù)安排,歡迎下載最新版組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
DevExpress XAF是一款強大的現(xiàn)代應(yīng)用程序框架,允許同時開發(fā)ASP.NET和WinForms。DevExpress XAF采用模塊化設(shè)計,開發(fā)人員可以選擇內(nèi)建模塊,也可以自行創(chuàng)建,從而以更快的速度和比開發(fā)人員當前更強有力的方式創(chuàng)建應(yīng)用程序。
.NET Aspire是一組工具、模板和包,用于構(gòu)建可觀察的、可生產(chǎn)的應(yīng)用程序。DevExpress XAF團隊花費了一些時間考慮Aspire的功能,試圖找到最好的集成點,讓XAF開發(fā)人員能夠利用Aspire開箱即用的業(yè)務(wù)流程特性。
DevExpress技術(shù)交流群11:749942875 歡迎一起進群討論
在最近的一篇文章中我們介紹了如何對一個 XAF Blazor 項目進行調(diào)整,來支持 .NET Aspire()。通過對啟動邏輯進行一些修改——包括標準的 XAF 項目模板和 Aspire 的 Visual Studio 向?qū)傻拇a,已經(jīng)可以讓 XAF Blazor 項目作為 Aspire 編排體系的一部分運行了。但那只是最小規(guī)模的編排,只有一個模塊!接下來我們將會把部署方面的內(nèi)容留到第三篇(敬請關(guān)注!),接下來得系列文章將介紹在示例項目中為實現(xiàn)以下三個場景所做的修改:
完整示例項目已托管在這個中。下面基于我在第一篇文章中描述的項目初始狀態(tài),展開說明新的功能實現(xiàn)。
在上文中(),我們?yōu)榇蠹医榻B了如何將SQL Server添加為容器依賴項,本文將繼續(xù)介紹如何安排額外的應(yīng)用程序服務(wù),歡迎繼續(xù)關(guān)注我們~
到目前為止,業(yè)務(wù)流程有兩個部分:SQL Server和Blazor Server應(yīng)用程序?,F(xiàn)在,我將向應(yīng)用程序系統(tǒng)添加一個額外的服務(wù),它將從Blazor應(yīng)用程序中的測試控制器調(diào)用。
首先創(chuàng)建一個新項目并將其添加到解決方案中,然后將對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
在新的服務(wù)項目中添加了一個類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();
到目前為止,這些都是熟悉的代碼,只是需要指出一些細節(jié):
現(xiàn)在修改文件XafAspireDemo.AppHost/Program.cs,將新項目添加到編排中。注意更改了對WithHttpsEndpoint的現(xiàn)有調(diào)用,來傳遞一個顯式名稱。Aspire不喜歡多個無參數(shù)調(diào)用,因為它不會分配自動生成的名稱。
... 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);
要從測試控制器調(diào)用新服務(wù),需要為它提供一個HTTP客戶端,修改XafAspireDemo.Blazor.Server/Startup.cs并添加這一行:
... services.ConfigureOpenTelemetry(Configuration, WebHostEnvironment); --> services.AddHttpClient(); services.ConfigureOpenTelemetryTracerProvider(builder => ...
現(xiàn)在可以使用HTTP客戶端從XafAspireDemo.Blazor.Server/Controllers/ImportantBusinessOperationsController.cs中的控制器調(diào)用服務(wù)。
... { 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) { ...
一個有趣的細節(jié):服務(wù)請求的URL使用主機名demoservice。因為主機將服務(wù)配置為依賴項,Blazor服務(wù)器的DNS解析允許訪問該名稱并將其解析為目標服務(wù)。
這就完成了更改!當我現(xiàn)在運行應(yīng)用程序時,Aspire Dashboard顯示了新的結(jié)構(gòu)。日志輸出現(xiàn)在包括來自新服務(wù)的項目,度量也包括在內(nèi)(選擇正確的資源來查看它們!),并且由于服務(wù)端點報告它自己的活動,現(xiàn)在您還可以在Traces頁面中看到嵌套的活動。
未完待續(xù),我們下期再見!更多產(chǎn)品資訊及授權(quán),歡迎來電咨詢:023-68661681
慧都是?家?業(yè)數(shù)字化解決?案公司,專注于軟件、?油與?業(yè)領(lǐng)域,以深?的業(yè)務(wù)理解和?業(yè)經(jīng)驗,幫助企業(yè)實現(xiàn)智能化轉(zhuǎn)型與持續(xù)競爭優(yōu)勢。
慧都科技是DevExpress的中國區(qū)的合作伙伴,DevExpress作為用戶界面領(lǐng)域的優(yōu)秀產(chǎn)品,幫助企業(yè)高效構(gòu)建權(quán)限管理、數(shù)據(jù)可視化(如網(wǎng)格/圖表/儀表盤)、跨平臺系統(tǒng)(WinForms/ASP.NET/.NET MAUI)及行業(yè)定制解決方案,加速開發(fā)并強化交互體驗。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)