灞桥微网站建设广而告之微信推广平台

张小明 2026/1/13 9:43:55
灞桥微网站建设,广而告之微信推广平台,中山移动网站建设报价,网站浮动广告怎么做什么是 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进行投诉反馈,一经查实,立即删除!

黑龙江营商监督建设局网站万网获取本地公网ip地址

在智慧医疗数字化转型浪潮中,桂花网(Cassia Networks)凭借自研蓝牙物联网核心技术与全栈式解决方案,已成为医疗领域蓝牙网关的优秀供应商。截至目前,其方案已深度落地1000家医院,对接100便携医疗终端品牌&a…

张小明 2026/1/6 1:37:09 网站建设

服装网站建设任务表软件外包公司为什么不好

从“变砖”到开机:手把手教你读懂机顶盒刷机日志你有没有过这样的经历?辛辛苦苦从网上搜罗了一个号称“2025最强性能优化”的机顶盒刷机包,满怀期待地刷进去,结果盒子一通震动后——无限重启、黑屏、卡LOGO动不了。这时候&#xf…

张小明 2026/1/5 1:17:10 网站建设

怎样申请网站域名和空间公司网站内容的更新

本地部署高颜值开源AI聊天应用LobeChat 在如今这个AIGC爆发的时代,几乎每个人都想拥有一个属于自己的“智能助手”。但市面上大多数工具要么功能单一,要么界面简陋,更别提数据隐私问题了。有没有一款既美观又强大、支持多模型接入、还能完全…

张小明 2026/1/6 6:03:49 网站建设

陕西建设工程信息网站西安官网排名推广

PyTorch模型微调实战:Miniconda-Python3.9镜像与数据集挂载全解析 在现代深度学习项目中,一个常见的场景是:你已经选好了预训练模型,写好了微调脚本,却卡在“环境不一致”或“数据读不到”这种非核心问题上。更糟糕的是…

张小明 2026/1/9 22:58:54 网站建设

网站建设及照片使用保密协议wordpress投稿页面

PyTorch-CUDA-v2.6镜像支持TorchData与Arrow IPC集成 在现代AI系统中,一个常被低估但至关重要的挑战是:数据喂得够快吗? 当你投入昂贵的A100集群训练视觉大模型时,GPU利用率却只有30%——问题往往不出在模型结构或硬件配置上&…

张小明 2026/1/12 20:25:59 网站建设

中国设计网站排行榜前十名杭州排名推广

如何快速恢复意外暴露的Git仓库:Git-Dumper终极指南 【免费下载链接】git-dumper A tool to dump a git repository from a website 项目地址: https://gitcode.com/gh_mirrors/gi/git-dumper 你是否曾经遇到过网站意外暴露.git目录的情况?想要恢…

张小明 2026/1/9 17:28:29 网站建设