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

Azure Functions/.NET Core中构造函数多接口参数的依赖注入实现

实现方案

你只需要按顺序先注册仓储依赖,再注册上层业务服务即可,DI容器会自动完成依赖的注入,不需要手动传入接口实例。

步骤1:注册仓储接口与实现

首先将你的仓储接口和对应的实现类注册到DI容器,假设你的仓储实现类为TicketRepository、FoodRepository:

// 注册仓储,生命周期按需选择Singleton/Scoped/Transient
s.AddSingleton<ITicketRepository, TicketRepository>();
s.AddSingleton<IFoodRepository, FoodRepository>();

步骤2:注册业务服务(两种可选写法)

推荐写法:自动依赖注入

直接使用DI提供的泛型注册重载,容器会自动解析构造函数的所有依赖,无需手动创建实例:

s.AddSingleton<ITicketService, TicketService>();
s.AddSingleton<IFoodService, FoodService>();
s.AddSingleton<IFinancialsService, FinancialsService>();

手动工厂写法(兼容你原有手动new的写法)

如果你需要手动控制实例创建逻辑,可以使用带IServiceProvider参数的工厂重载,从容器中解析出需要的依赖再传入构造函数:

s.AddSingleton<ITicketService>(sp => new TicketService(sp.GetRequiredService<ITicketRepository>()));
s.AddSingleton<IFoodService>(sp => new FoodService(sp.GetRequiredService<IFoodRepository>()));
s.AddSingleton<IFinancialsService>(sp => new FinancialsService(
    sp.GetRequiredService<ITicketRepository>(),
    sp.GetRequiredService<IFoodRepository>()
));

其中sp是DI构建好的服务提供器实例,GetRequiredService会直接返回对应服务的实例,如果依赖未注册会直接抛出异常,避免空引用问题。


完整可运行示例(Azure Functions场景)

首先确保你已安装NuGet包:Microsoft.Azure.Functions.Extensions

Startup类完整代码

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using YourNamespace.Interfaces;
using YourNamespace.Services;
using YourNamespace.Repositories;

[assembly: FunctionsStartup(typeof(YourNamespace.Startup))]
namespace YourNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var s = builder.Services;
            
            // 注册仓储
            s.AddSingleton<ITicketRepository, TicketRepository>();
            s.AddSingleton<IFoodRepository, FoodRepository>();
            
            // 注册业务服务
            s.AddSingleton<ITicketService, TicketService>();
            s.AddSingleton<IFoodService, FoodService>();
            s.AddSingleton<IFinancialsService, FinancialsService>();
        }
    }

    // 仓储示例实现,你需要自行补全接口定义的方法逻辑
    public class TicketRepository : ITicketRepository
    {
        // 实现ITicketRepository的接口方法
    }

    public class FoodRepository : IFoodRepository
    {
        // 实现IFoodRepository的接口方法
    }
}

函数类中注入使用示例

public class StatsFunction
{
    private readonly IFinancialsService _financialsService;

    // 构造函数注入,DI会自动传入已构建完成的服务实例
    public StatsFunction(IFinancialsService financialsService)
    {
        _financialsService = financialsService;
    }

    [FunctionName("GetFinancialStats")]
    public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
    {
        var stats = _financialsService.GetStats();
        return new OkObjectResult(stats);
    }
}

注意事项
  • 所有构造函数中出现的依赖都必须提前注册到DI容器,否则运行时会抛出服务未找到的异常
  • DI会自动递归解析所有层级的依赖,比如你的仓储如果依赖DbContext,只需要提前注册DbContext即可,不需要手动传入
  • 生命周期可按需调整:无状态服务用Singleton,需要每次函数请求新建实例用Scoped,每次调用都新建用Transient

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:03