网站建设会遇到哪些难题营销网站开发哪家好

张小明 2026/1/7 13:09:37
网站建设会遇到哪些难题,营销网站开发哪家好,物流网站建设 市场分析,手机商城系统哪个好什么是 Mud 代码生成器#xff1f;Mud 代码生成器是一个基于 Roslyn 的源代码生成器#xff0c;用于自动生成数据实体、服务层相关代码#xff0c;提高开发效率。服务层代码生成包含以下主要功能#xff1a;服务类代码生成 - 根据实体类自动生成服务接口和服务实现类依赖注…什么是 Mud 代码生成器Mud 代码生成器是一个基于 Roslyn 的源代码生成器用于自动生成数据实体、服务层相关代码提高开发效率。服务层代码生成包含以下主要功能服务类代码生成 - 根据实体类自动生成服务接口和服务实现类依赖注入代码生成 - 自动为类生成构造函数注入代码包括日志、缓存、用户管理等常用服务服务注册代码生成 - 自动生成服务注册扩展方法简化依赖注入配置HttpClient API 代码生成 - 自动为标记了 HTTP 方法特性的接口生成 HttpClient 实现类HttpClient API 源生成器详解核心功能HttpClientApiSourceGenerator 是一个专门用于生成 HttpClient 实现类的源代码生成器。它基于 Roslyn 技术能够自动为标记了 [HttpClientApi] 特性的接口生成完整的 HttpClient 实现类支持 RESTful API 调用。工作原理源生成器的工作流程如下扫描项目中的接口查找标记了 [HttpClientApi] 特性的接口分析接口中定义的方法和参数根据 HTTP 方法特性如 [Get], [Post], [Put] 等生成相应的实现代码处理各种参数特性如 [Path], [Query], [Body], [Header]生成完整的 HttpClient 实现类包括构造函数、日志记录、错误处理等使用示例让我们通过一个具体的示例来了解如何使用这个生成器[HttpClientApi]public interface IDingTalkApi{[Get(/api/v1/user/{id})]TaskUserDto GetUserAsync([Query] string id);[Post(/api/v1/user)]TaskUserDto CreateUserAsync([Body] UserDto user);[Put(/api/v1/user/{id})]TaskUserDto UpdateUserAsync([Path] string id, [Body] UserDto user);[Delete(/api/v1/user/{id})]Taskbool DeleteUserAsync([Path] string id);}当项目编译时HttpClientApiSourceGenerator 会自动生成一个实现该接口的类大致如下// 自动生成的代码public partial class DingTalkApi : IDingTalkApi{private readonly HttpClient _httpClient;private readonly ILoggerDingTalkApi _logger;private readonly JsonSerializerOptions _jsonSerializerOptions;public DingTalkApi(HttpClient httpClient, ILoggerDingTalkApi logger){_httpClient httpClient ?? throw new ArgumentNullException(nameof(httpClient));_logger logger ?? throw new ArgumentNullException(nameof(logger));_jsonSerializerOptions new JsonSerializerOptions{PropertyNamingPolicy JsonNamingPolicy.CamelCase,WriteIndented false,PropertyNameCaseInsensitive true};}public async TaskUserDto GetUserAsync(string id){// 自动生成的 HTTP GET 请求逻辑_logger.LogDebug(开始HTTP GET请求: {Url}, /api/v1/user/{id});var url $/api/v1/user/{id};using var request new HttpRequestMessage(HttpMethod.Get, url);// 处理查询参数var queryParams new Liststring();if (id ! null)queryParams.Add($id{id});if (queryParams.Any())url ? string.Join(, queryParams);// 发送请求并处理响应// ... 完整的请求处理逻辑}}支持的 HTTP 方法该生成器支持所有标准的 HTTP 方法[HttpClientApi]public interface IExampleApi{[Get(/api/resource/{id})]TaskResourceDto GetResourceAsync([Path] string id);[Post(/api/resource)]TaskResourceDto CreateResourceAsync([Body] ResourceDto resource);[Put(/api/resource/{id})]TaskResourceDto UpdateResourceAsync([Path] string id, [Body] ResourceDto resource);[Delete(/api/resource/{id})]Taskbool DeleteResourceAsync([Path] string id);[Patch(/api/resource/{id})]TaskResourceDto PatchResourceAsync([Path] string id, [Body] object patchData);[Head(/api/resource/{id})]Taskbool CheckResourceExistsAsync([Path] string id);[Options(/api/resource)]TaskHttpResponseMessage GetResourceOptionsAsync();}参数特性详解生成器支持多种参数特性以处理不同的 HTTP 请求参数Path 参数特性用于替换 URL 模板中的路径参数[Get(/api/users/{userId}/orders/{orderId})]TaskOrderDto GetOrderAsync([Path] string userId, [Path] string orderId);Query 参数特性用于生成查询字符串参数[Get(/api/users)]TaskListUserDto GetUsersAsync([Query] string name,[Query] int? page,[Query] int? pageSize);Body 参数特性用于设置请求体内容[Post(/api/users)]TaskUserDto CreateUserAsync([Body] UserDto user);// 支持自定义内容类型[Post(/api/users)]TaskUserDto CreateUserAsync([Body(ContentType application/xml)] UserDto user);// 支持字符串内容[Post(/api/logs)]Task LogMessageAsync([Body(UseStringContent true)] string message);Header 参数特性用于设置请求头[Get(/api/protected)]TaskProtectedData GetProtectedDataAsync([Header] string authorization);// 自定义头名称[Get(/api/protected)]TaskProtectedData GetProtectedDataAsync([Header(X-API-Key)] string apiKey);复杂参数处理生成器还能处理复杂的参数类型复杂查询参数支持复杂对象作为查询参数自动展开为键值对[Get(/api/search)]TaskListUserDto SearchUsersAsync([Query] UserSearchCriteria criteria);public class UserSearchCriteria{public string Name { get; set; }public int? Age { get; set; }public string Department { get; set; }}// 生成的查询字符串?NameJohnAge30DepartmentIT路径参数自动替换自动处理 URL 模板中的路径参数[Get(/api/users/{userId}/orders/{orderId}/items/{itemId})]TaskOrderItemDto GetOrderItemAsync([Path] string userId,[Path] string orderId,[Path] string itemId);// 自动替换/api/users/123/orders/456/items/789错误处理与日志记录生成的代码包含完整的错误处理和日志记录public async TaskUserDto GetUserAsync(string id){try{_logger.LogDebug(开始HTTP GET请求: {Url}, /api/v1/user/{id});// 请求处理逻辑using var response await _httpClient.SendAsync(request);var responseContent await response.Content.ReadAsStringAsync();_logger.LogDebug(HTTP请求完成: {StatusCode}, 响应长度: {ContentLength},(int)response.StatusCode, responseContent?.Length ?? 0);if (!response.IsSuccessStatusCode){_logger.LogError(HTTP请求失败: {StatusCode}, 响应: {Response},(int)response.StatusCode, responseContent);throw new HttpRequestException($HTTP请求失败: {(int)response.StatusCode} - {response.ReasonPhrase});}// 响应处理逻辑}catch (Exception ex){_logger.LogError(ex, HTTP请求异常: {Url}, url);throw;}}HttpClient API 注册源生成器详解核心功能HttpClientApiRegisterSourceGenerator 是另一个重要的组件它自动为标记了 [HttpClientApi] 特性的接口生成依赖注入注册代码简化 HttpClient 服务的配置。工作原理该生成器的工作流程如下扫描项目中的接口查找标记了 [HttpClientApi] 特性的接口提取特性中的配置参数如 BaseUrl、Timeout 等生成用于依赖注入的扩展方法自动注册接口和实现类到服务容器中使用示例首先定义 HTTP API 接口[HttpClientApi(https://api.dingtalk.com, Timeout 30)]public interface IDingTalkApi{[Get(/api/v1/user/{id})]TaskUserDto GetUserAsync([Query] string id);[Post(/api/v1/user)]TaskUserDto CreateUserAsync([Body] UserDto user);}[HttpClientApi(https://api.wechat.com, Timeout 60)]public interface IWeChatApi{[Get(/api/v1/user/{id})]TaskUserDto GetUserAsync([Query] string id);}生成器会自动生成以下注册代码// 自动生成的代码 - HttpClientApiExtensions.g.csusing System;using System.Net.Http;using Microsoft.Extensions.DependencyInjection;namespace Microsoft.Extensions.DependencyInjection{public static class HttpClientApiExtensions{public static IServiceCollection AddWebApiHttpClient(this IServiceCollection services){services.AddHttpClientglobal::YourNamespace.IDingTalkApi, global::YourNamespace.DingTalkApi(client {client.BaseAddress new Uri(https://api.dingtalk.com);client.Timeout TimeSpan.FromSeconds(30);});services.AddHttpClientglobal::YourNamespace.IWeChatApi, global::YourNamespace.WeChatApi(client {client.BaseAddress new Uri(https://api.wechat.com);client.Timeout TimeSpan.FromSeconds(60);});return services;}}}配置选项HttpClientApi 特性参数// 基本配置[HttpClientApi(https://api.example.com)]public interface IExampleApi { }// 配置超时时间[HttpClientApi(https://api.example.com, Timeout 120)]public interface IExampleApi { }// 使用命名参数[HttpClientApi(BaseUrl https://api.example.com, Timeout 60)]public interface IExampleApi { }使用方式在应用程序启动时调用// 在 Program.cs 或 Startup.cs 中var builder WebApplication.CreateBuilder(args);// 自动注册所有 HttpClient API 服务builder.Services.AddWebApiHttpClient();// 或者与其他服务注册一起使用builder.Services.AddControllers().AddWebApiHttpClient();在控制台应用程序中使用// 在控制台应用程序中var services new ServiceCollection();// 注册 HttpClient API 服务services.AddWebApiHttpClient();var serviceProvider services.BuildServiceProvider();var dingTalkApi serviceProvider.GetRequiredServiceIDingTalkApi();两个生成器的协同工作HttpClientApiRegisterSourceGenerator 与 HttpClientApiSourceGenerator 完美配合提供完整的开发体验HttpClientApiSourceGenerator 生成接口的实现类HttpClientApiRegisterSourceGenerator 生成依赖注入注册代码完整的开发体验定义接口 → 自动生成实现 → 自动注册服务完整示例// 1. 定义接口[HttpClientApi(https://api.dingtalk.com, Timeout 30)]public interface IDingTalkApi{[Get(/api/v1/user/{id})]TaskUserDto GetUserAsync([Query] string id);}// 2. 自动生成实现类 (由 HttpClientApiSourceGenerator 生成)// public partial class DingTalkApi : IDingTalkApi { ... }// 3. 自动生成注册代码 (由 HttpClientApiRegisterSourceGenerator 生成)// public static class HttpClientApiExtensions { ... }// 4. 在应用程序中使用var builder WebApplication.CreateBuilder(args);builder.Services.AddWebApiHttpClient(); // 自动注册var app builder.Build();// 5. 在服务中注入使用public class UserService{private readonly IDingTalkApi _dingTalkApi;public UserService(IDingTalkApi dingTalkApi){_dingTalkApi dingTalkApi;}public async TaskUserDto GetUserAsync(string userId){return await _dingTalkApi.GetUserAsync(userId);}}高级配置自定义 HttpClient 配置如果需要更复杂的 HttpClient 配置可以在注册后继续配置builder.Services.AddWebApiHttpClient().ConfigureHttpClientDefaults(httpClient {httpClient.ConfigurePrimaryHttpMessageHandler(() new HttpClientHandler{UseProxy false,AllowAutoRedirect false});});添加自定义请求头builder.Services.AddHttpClientIDingTalkApi, DingTalkApi(client {client.BaseAddress new Uri(https://api.dingtalk.com);client.Timeout TimeSpan.FromSeconds(30);client.DefaultRequestHeaders.Add(User-Agent, MyApp/1.0);client.DefaultRequestHeaders.Add(X-API-Key, your-api-key);});生成的代码结构obj/Debug/net8.0/generated/├── Mud.ServiceCodeGenerator/├── HttpClientApiSourceGenerator/│ └── YourNamespace.DingTalkApi.g.cs└── HttpClientApiRegisterSourceGenerator/└── HttpClientApiExtensions.g.cs最佳实践统一配置在 [HttpClientApi] 特性中统一配置所有 API 的基础设置合理超时根据 API 的响应时间设置合理的超时时间命名规范遵循接口命名规范I{ServiceName}Api错误处理在服务层处理 API 调用异常日志记录利用生成的日志记录功能监控 API 调用如何查看生成的代码要查看生成的代码可以在项目文件中添加以下配置PropertyGroupEmitCompilerGeneratedFilestrue/EmitCompilerGeneratedFiles/PropertyGroup生成的代码将位于 obj/[Configuration]/[TargetFramework]/generated/ 目录下文件名以 .g.cs 结尾。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

如何用百度搜自己做的网站网易手游开服表

PHP 运算符 概述 PHP 作为一种流行的服务器端脚本语言,在数据处理和逻辑运算方面提供了丰富的运算符。运算符是编程语言中用于表示操作的两个或多个值的符号。在 PHP 中,运算符不仅用于基本的算术运算,还用于比较、赋值、逻辑操作等。本文将详细介绍 PHP 中的各种运算符及…

张小明 2026/1/4 5:37:34 网站建设

张家界seo网站优化威海百度网站建设

Intent-Model:智能问答系统中的用户意图分类利器 【免费下载链接】intent-model 项目地址: https://ai.gitcode.com/hf_mirrors/Danswer/intent-model 在当今AI技术飞速发展的时代,用户意图分类模型已成为智能问答系统不可或缺的核心组件。Inten…

张小明 2025/12/31 22:30:34 网站建设

站长统计iosphp 显示不同网站内容

Excalidraw AI:当手绘白板遇上多轮对话式智能编辑 在一场远程架构评审会上,产品经理刚说完“把认证服务移到左边,并加个 Redis 缓存”,屏幕上的图表就已经完成了调整——没有拖拽、没有菜单点击,只有自然的语言和即时的…

张小明 2025/12/31 13:46:33 网站建设

建设银行网站扫码支付在哪里千城网站建设

长尾关键词在SEO策略中占据着重要地位,因为它们能够帮助网站提高搜索引擎的排名并吸引特定用户群。长尾关键词的特点是更长且更具针对性,这让用户能够找到更加符合他们需求的内容。通过对目标受众进行深入分析,网站可以识别出高价值的长尾关键…

张小明 2025/12/31 22:30:33 网站建设

网站建设服务费做什么分录wordpress 安装语言设置

百度网盘极速下载:3步告别龟速等待的实用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度而烦恼吗?想要实现百度网盘极速…

张小明 2025/12/31 22:30:35 网站建设

普通企业网站营销企业网站推广技术

简 介: 本文展示了一款仅巴掌大小的微型智能车设计。该智能车采用整块电路板作为车体,配备光电传感器检测赛道引导线,通过3D打印外壳固定两个微型电机。虽体积小巧,但集成了控制器、电机驱动芯片、光电传感器等完整功能模块&#…

张小明 2025/12/31 22:30:33 网站建设