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

使用Action委托时如何访问已配置的值?技术咨询

如何在服务内部访问通过Action配置的值?

嘿,我来帮你理清这个问题!你现在的困惑在于,用Action<CustomOptions>配置了选项,但不知道怎么在服务里拿到配置后的AppId——其实核心是你需要在扩展方法里创建并保存配置后的Options实例,而不是只执行那个Action就完事了。咱们一步步来解决:

1. 先梳理你当前代码的问题

你写的UseMyService扩展方法只是接收了用户传入的配置Action,但既没有创建CustomOptions实例,也没有把配置后的实例传递给你的服务,所以服务内部自然拿不到AppId。

2. 修改扩展方法,保存配置后的Options

我们需要在扩展方法里完成这几个步骤:

  • 创建CustomOptions的实例
  • 执行用户传入的Action来配置这个实例
  • 把配置好的实例注册到DI容器(或者直接传递给你的服务)

假设你的服务类是这样的(需要依赖CustomOptions):

public class MyService
{
    private readonly CustomOptions _configuredOptions;

    // 通过构造函数注入配置好的Options
    public MyService(CustomOptions options)
    {
        _configuredOptions = options;
    }

    public void DoWork()
    {
        // 这里就能直接访问配置后的AppId了!
        Console.WriteLine($"当前配置的AppId是: {_configuredOptions.AppId}");
    }
}

然后修改你的扩展方法:

public static IApplicationBuilder UseMyService(this IApplicationBuilder builder, Action<CustomOptions> configureOptions)
{
    // 第一步:创建空的Options实例
    var options = new CustomOptions();
    // 第二步:执行用户的配置逻辑,给AppId赋值
    configureOptions(options);
    // 第三步:把配置好的Options注册到DI容器,这样服务就能通过构造函数注入拿到它
    builder.ApplicationServices.GetRequiredService<IServiceCollection>().AddSingleton(options);
    
    // 如果你的服务需要直接实例化,也可以在这里做:
    // var myService = new MyService(options);
    // 之后可以把myService挂载到应用上下文或者其他地方供后续使用

    // 返回builder支持链式调用
    return builder;
}

3. 关于要不要用Func委托?

完全不需要!Func通常用于延迟获取值或者需要动态生成实例的场景,而你的场景是一次性配置选项,Action完全够用——只要你正确保存了配置后的实例就行。

4. 如果是中间件场景的补充

如果你的MyService是一个中间件,那可以在中间件的构造函数里直接注入CustomOptions,比如:

public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly CustomOptions _options;

    public MyMiddleware(RequestDelegate next, CustomOptions options)
    {
        _next = next;
        _options = options;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 在这里就能使用配置好的AppId了
        Console.WriteLine($"中间件中获取到的AppId: {_options.AppId}");
        await _next(context);
    }
}

对应的扩展方法还要加上中间件注册:

public static IApplicationBuilder UseMyService(this IApplicationBuilder builder, Action<CustomOptions> configureOptions)
{
    var options = new CustomOptions();
    configureOptions(options);
    builder.ApplicationServices.GetRequiredService<IServiceCollection>().AddSingleton(options);
    
    // 添加中间件到管道
    return builder.UseMiddleware<MyMiddleware>();
}

总结

你之前遗漏的核心步骤就是创建并保留配置后的Options实例,只要把这个实例传递给你的服务(不管是通过DI注入还是直接实例化),就能在服务内部访问AppId了。

内容的提问来源于stack exchange,提问作者SteinTech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:38