【发布时间】:2019-01-08 14:35:50
【问题描述】:
在 ASP.NET Core 中,我们可以在启动期间注册所有依赖项,这些依赖项在应用程序启动时执行。然后将注册的依赖注入到控制器构造函数中。
public class ReportController
{
private IReportFactory _reportFactory;
public ReportController(IReportFactory reportFactory)
{
_reportFactory = reportFactory;
}
public IActionResult Get()
{
vart report = _reportFactory.Create();
return Ok(report);
}
}
现在我想根据当前请求中的数据(用户授权级别或随请求传递的查询字符串中的某个值)注入 IReportFactory 的不同实现。
问题:ASP.NET Core 中是否有任何内置的抽象(中间件),我们可以在其中注册另一个接口实现?
如果没有内置功能,可能的方法是什么?
更新
以IReportFactory 接口为例。实际上,我在不同的地方注入了一堆低级接口。现在我希望根据请求数据注入这些低级接口的不同实现。
public class OrderController
{
private IOrderService _orderService;
public OrderController(IOrderService orderService)
{
_orderService = orderService;
}
public IActionResult Create()
{
var order = _orderService.Create();
return Ok(order);
}
}
public class OrderService
{
private OrderBuilder _orderBuilder;
private IShippingService _shippingService; // This now have many different implementations
public OrderService(
OrderBuilder _orderBuilder,
IShippingService _shippingService)
{
_orderService = orderService;
_shippingService = shippingService;
}
public Order Create()
{
var order = _orderBuilder.Build();
var order.ShippingInfo = _shippingService.Ship();
return order;
}
}
因为我们知道我们需要在应用程序的入口点使用哪个实现(我认为控制器操作可以被视为应用程序的入口点),我们希望已经在那里注入正确的实现 - 不需要对已经存在的设计进行任何更改。
【问题讨论】:
-
你已经有工厂了。使用带有参数的工厂方法
Create来检索特定实例。如果您需要不同的工厂工厂(为什么?),那么您可以使用抽象工厂模式。 -
你可以注册同一个接口的多个实现,你会得到一个
IEnumerable<IInterface>注入。
标签: c# asp.net-core dependency-injection