使用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
相关产品推荐
相关产品推荐

