在构造函数中使用多个接口作为参数的依赖注入



我是Core/Azure Functions的新手,并试图使用DI容器来添加依赖项。

我想添加类/接口依赖到DI容器:

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

对于上述三个依赖于存储库类的类/接口,我该如何做呢?

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)
);

最新更新