具有多个接口的依赖注入作为构造函数中的参数

Dependency Injection with multiple interfaces as parameters in constructor

我是 Core/Azure 函数的新手,正在尝试使用 DI 容器添加依赖项。

我想将 class/interface 依赖项添加到 DI 容器:

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

我该如何处理以上三个 classes/interfaces,因为它们依赖于存储库 类。

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

下面是那些类和接口的相关代码:

public interface ITicketService { ... }
public interface IFoodService { ... }
public interface IFinancialsService { ... }

public class TicketService : ITicketService
{
    private readonly ITicketRepository _ticketRepo;

    public TicketService(ITicketRepository ticketRepo) => _ticketRepo = ticketRepo;
}

public class FoodService : IFoodService 
{
    private readonly IFoodRepository _foodRepo;

    public FoodService(IFoodRepository foodRepo) => _foodRepo = foodRepo;
}

public class FinancialsService : IFinancialsService
{
    private readonly ITicketRepository _ticketRepo;
    private readonly IFoodRepository _foodRepo;

    public FinancialsService(ITicketRepository ticketRepo, IFoodRepository foodRepo)
    {
        _ticketRepo = ticketRepo;
        _foodRepo = foodRepo;
    }

    public FinancialStats GetStats() ...
}

任何工作示例将不胜感激。

在注册类型时也说明实现的地方使用重载。

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

s.AddSingleton<ITicketRepository, TicketRepository>();
s.AddSingleton<IFoodRepository, FoodRepository>();

容器将根据注册的抽象及其实现解决依赖关系。

如果您需要手动创建实例,则可以使用工厂委托来解析所需的依赖关系

//... assuming other dependencies already registered

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

或使用ActivatorUtilities

简化
//... assuming other dependencies already registered

s.AddSingleton<IFinancialsService>(sp => 
    ActivatorUtilities.CreateInstance<FinancialsService>(sp)
);