You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:55:21