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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:28