(на самом деле не работаю с заказами, но используется в качестве примера)
Код: Выделить всё
[ApiController]
[Route("{site}/Order")]
public class OrderController
{
private readonly Dictionary _orderModels;
public class OrderController(Dictionary orderModels)
{
_orderModels = orderModels;
}
[HttpGet("{orderNumber:int}"]
public async Task GetOrderAsync(string site, int orderNumber)
{
if (!_orderModels.TryGetValue(site, out var orderModel))
return NotFound();
if (!User.HasAccessToSite(site))
return Forbid();
var order = await orderModel.GetExistingOrderAsync(orderNumber);
return Ok(order)
}
}
Код: Выделить всё
private static Dictionary CreateOrderModels(IServiceProvider services)
{
var orderModels = new Dictionary();
var site1Repository = services.GetRequiredService();
var logger = services.GetRequiredService>();
orderModels.Add("Site1", new CommonOrderModel(site1Repository, logger);
...
return orderModels;
}
Я думал, что с помощью нового DI на основе ключей я смогу упростить создание, например
Код: Выделить всё
services.AddKeyedSingleton("Site1");
services.AddKeyedSingleton("Site2");
services.AddKeyedSingleton("Site3");
services.AddKeyedSingleton("Site1");
services.AddKeyedSingleton("Site2");
services.AddKeyedSingleton("Site3");
Я хотел бы сделать что-то вроде:
Код: Выделить всё
public CommonOrderModel([FromKeyedServices(KeyedService.ParentKey)] IRepository repository, ILogger logger)
Я понимаю, что это невозможно «из коробки». Пытался просмотреть исходный код, чтобы посмотреть, смогу ли я куда-нибудь внедрить эту функциональность, но не смог.
Основная проблема, по-видимому, заключается в том, что граф зависимостей недоступен ни в одном фабричном методе, поэтому его невозможно получить ключ сверху.
А такое вообще возможно?
Подробнее здесь: https://stackoverflow.com/questions/790 ... -injection
Мобильная версия