AutoCAD 2025(.NET 8)插件依赖注入实现方法问询
AutoCAD 2025 .NET 8 插件依赖注入实现方案
核心思路
AutoCAD 2025基于.NET 8运行,但插件加载环境有特殊限制,直接用HostBuilder会引发加载冲突,需通过ServiceCollection轻量构建服务容器,在插件初始化入口(IExtensionApplication)完成服务注册,再在命令中从全局容器获取服务实例。
1. 插件初始化与服务容器构建
实现IExtensionApplication接口作为插件入口,在此完成配置加载、服务注册和容器构建:
using Autodesk.AutoCAD.Runtime; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using System.IO; namespace AutoCADForgePlugin { public class PluginInitializer : IExtensionApplication { // 全局服务容器实例 public static IServiceProvider ServiceProvider { get; private set; } public void Initialize() { // 加载配置文件(appsettings.json) var configBuilder = new ConfigurationBuilder() .SetBasePath(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); var configuration = configBuilder.Build(); // 注册服务 var services = new ServiceCollection(); // 绑定Forge API配置选项 services.Configure<ForgeApiOptions>(configuration.GetSection("ForgeApi")); // 注册复用的Forge API服务 services.AddScoped<IForgeApiService, ForgeApiService>(); // 构建服务容器 ServiceProvider = services.BuildServiceProvider(); } public void Terminate() { // 插件卸载时释放容器资源 if (ServiceProvider is IDisposable disposable) { disposable.Dispose(); } } } }
2. 配置选项定义
定义与appsettings.json对应的配置类,对应现有Web API中的Forge配置:
public class ForgeApiOptions { public string ClientId { get; set; } public string ClientSecret { get; set; } public string BaseUrl { get; set; } = "https://developer.api.autodesk.com"; }
编写appsettings.json(需设置复制属性为如果较新则复制):
{ "ForgeApi": { "ClientId": "your-client-id", "ClientSecret": "your-client-secret" } }
3. 复用Forge API服务
直接复用现有Web API中的服务实现,仅需确保构造函数通过IOptions<ForgeApiOptions>注入配置:
using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Options; public interface IForgeApiService { Task<string> GetAccessTokenAsync(); // 其他已实现的Forge API方法... } public class ForgeApiService : IForgeApiService { private readonly ForgeApiOptions _forgeOptions; public ForgeApiService(IOptions<ForgeApiOptions> options) { _forgeOptions = options.Value; } // 复用原Web API中的AccessToken获取逻辑 public async Task<string> GetAccessTokenAsync() { using var httpClient = new HttpClient(); var requestContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("client_id", _forgeOptions.ClientId), new KeyValuePair<string, string>("client_secret", _forgeOptions.ClientSecret), new KeyValuePair<string, string>("grant_type", "client_credentials"), new KeyValuePair<string, string>("scope", "data:read") }); var response = await httpClient.PostAsync( $"{_forgeOptions.BaseUrl}/authentication/v1/authenticate", requestContent); response.EnsureSuccessStatusCode(); var tokenResponse = await response.Content.ReadFromJsonAsync<ForgeTokenResponse>(); return tokenResponse.AccessToken; } } // 辅助解析类 public class ForgeTokenResponse { [JsonPropertyName("access_token")] public string AccessToken { get; set; } [JsonPropertyName("expires_in")] public int ExpiresIn { get; set; } }
4. 在AutoCAD命令中消费服务
通过全局容器创建作用域,获取服务实例并调用方法:
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; using Microsoft.Extensions.DependencyInjection; namespace AutoCADForgePlugin.Commands { public class ForgeCommands { [CommandMethod("GetForgeToken")] public void GetForgeToken() { var editor = Application.DocumentManager.MdiActiveDocument.Editor; // 创建服务作用域(避免长期持有服务实例) using var scope = PluginInitializer.ServiceProvider.CreateScope(); var forgeService = scope.ServiceProvider.GetRequiredService<IForgeApiService>(); try { // 同步调用异步方法(适配AutoCAD命令的同步执行环境) var token = forgeService.GetAccessTokenAsync().GetAwaiter().GetResult(); editor.WriteMessage($"\nForge Access Token: {token}"); } catch (Exception ex) { editor.WriteMessage($"\n错误信息: {ex.Message}"); } } } }
常见问题排查
- HostBuilder加载失败:AutoCAD插件加载上下文与HostBuilder的默认生命周期、依赖加载逻辑冲突,需改用
ServiceCollection轻量构建容器,避免引入不必要的主机服务(如日志、托管服务)。 - 配置文件找不到:确保
appsettings.json的复制到输出目录属性设置为“如果较新则复制”,否则AutoCAD无法读取配置。 - 无加载报错:查看AutoCAD日志文件(路径:
%APPDATA%\Autodesk\AutoCAD 2025\R20.5\chs\Logs),获取详细加载失败原因。
内容的提问来源于stack exchange,提问作者Jaroslav Daníček
相关产品推荐
相关产品推荐

