具有多个接口的依赖注入作为构造函数中的参数
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)
);
我是 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)
);