如何让NuGet包支持依赖注入(DI)并添加配置选项?
实现NuGet包的依赖注入支持及配置选项
要让你的NuGet包支持依赖注入并实现指定的配置调用方式,只需按以下步骤改造代码:
1. 定义服务接口
先创建你提到的IGETSum接口,把业务方法抽象出来,这是依赖注入的核心基础:
namespace IGETSum { public interface IGETSum { int SUMorSUB(int num1, int num2); } }
2. 创建配置选项类
用强类型类接收用户配置的操作类型,同时添加验证逻辑避免非法输入:
namespace IGETSum { public class SumNugetOptions { public string Operation { get; set; } = "+"; // 验证配置的合法性 public void Validate() { if (Operation != "+" && Operation != "-") { throw new ArgumentException("Operation must be either '+' or '-'"); } } } }
3. 修改服务实现类
让SumNuget实现IGETSum接口,通过构造函数注入配置选项,同时修正原代码返回值错误:
using System; namespace IGETSum { public class SumNuget : IGETSum { private readonly string _operation; // 通过构造函数注入配置好的选项 public SumNuget(SumNugetOptions options) { options.Validate(); _operation = options.Operation; } public int SUMorSUB(int num1, int num2) { return _operation switch { "+" => num1 + num2, "-" => num1 - num2, _ => throw new InvalidOperationException("Invalid operation configured") }; } } }
4. 编写DI扩展方法
这一步实现你要求的builder.Services.SUMorSUB(...)简洁调用方式:
using Microsoft.Extensions.DependencyInjection; namespace IGETSum { public static class SumNugetServiceExtensions { public static IServiceCollection SUMorSUB(this IServiceCollection services, Action<SumNugetOptions> configure) { // 注册并应用用户配置 services.Configure(configure); // 注册服务实例(可根据需求替换为AddSingleton/AddTransient) services.AddScoped<IGETSum, SumNuget>(); return services; } } }
5. 应用端调用示例
现在用户可以按你要求的方式在Program.cs中注册并使用服务:
var builder = WebApplication.CreateBuilder(args); // 注册并配置NuGet服务 builder.Services.SUMorSUB(opt => opt.Operation = "+"); var app = builder.Build(); // 示例:在API端点中使用服务 app.MapGet("/calculate/{num1}/{num2}", (int num1, int num2, IGETSum sumService) => { return sumService.SUMorSUB(num1, num2); }); app.Run();
核心说明
- 接口抽象:通过
IGETSum接口实现依赖倒置,方便用户后续替换服务实现 - 强类型配置:避免字符串硬编码,同时通过验证逻辑保障配置合法性
- 扩展方法:让服务注册方式符合.NET生态的惯用写法,简洁直观
- 构造注入:服务依赖的配置通过构造函数传入,符合DI最佳实践
内容的提问来源于stack exchange,提问作者mohammed alani
相关产品推荐
相关产品推荐

